繁体   English   中英

将一个向量的值分配给基于 R 中另一个向量的组

[英]assign value from one vector to a group based on another vector in R

我有 2 个向量:

v1 = c(4, 8, 13)
v2 = 1:20

我想根据元素比较将v2中的每个元素分类到特定组。 在此示例中,v2 中的值 1:4 将归类到 group1,值 5:8 归类到 group2,值 9:13 归类到 group3,值 14:20 归类到 group4。

我想要一个最终的 df

在此处输入图像描述

有什么建议么

我们可以使用%in%cumsum来创建索引并paste 'group'

data.frame(ls2 = v2, group = paste0("group", cumsum(v2 %in% (v1 + 1)) + 1))

-输出

 ls2  group
1    1 group1
2    2 group1
3    3 group1
4    4 group1
5    5 group2
6    6 group2
7    7 group2
8    8 group2
9    9 group3
10  10 group3
11  11 group3
12  12 group3
13  13 group3
14  14 group4
15  15 group4
16  16 group4
17  17 group4
18  18 group4
19  19 group4
20  20 group4

可能有更多通用/优雅的解决方案,但要根据示例重新创建所需的数据集,您可以尝试:


group <- case_when(v2 <= v1[1] ~ "group1",
                   v2 %in% (v1[1]+1):v1[2] ~"group2",
                   v2 %in% (v1[2]+1):v1[3] ~"group3",
                   v2 > v1[3] ~"group4"
)

cbind(v2, group)
# v2   group   
# [1,] "1"  "group1"
# [2,] "2"  "group1"
# [3,] "3"  "group1"
# [4,] "4"  "group1"
# [5,] "5"  "group2"
# [6,] "6"  "group2"

你可以使用findInterval吗?

data.frame(
  v2,
  group = paste0("group", findInterval(v2, v1, left.open = T) + 1)
)

Output

   v2  group
1   1 group1
2   2 group1
3   3 group1
4   4 group1
5   5 group2
6   6 group2
7   7 group2
8   8 group2
9   9 group3
10 10 group3
11 11 group3
12 12 group3
13 13 group3
14 14 group4
15 15 group4
16 16 group4
17 17 group4
18 18 group4
19 19 group4
20 20 group4

一个简单的方法是:

id = seq_len(length(v1) + 1)
n = diff(c(0, v1, length(v2)))

rep(id, n)
#[1] 1 1 1 1 2 2 2 2 3 3 3 3 3 4 4 4 4 4 4 4

另一种可能的解决方案:

v1 = c(4, 8, 13)
v2 = 1:20

data.frame(v2, groups = cut(v2, breaks = c(0,v1,20),
           labels = paste0("group", 1:(1+length(v1)))))

#>    v2 groups
#> 1   1 group1
#> 2   2 group1
#> 3   3 group1
#> 4   4 group1
#> 5   5 group2
#> 6   6 group2
#> 7   7 group2
#> 8   8 group2
#> 9   9 group3
#> 10 10 group3
#> 11 11 group3
#> 12 12 group3
#> 13 13 group3
#> 14 14 group4
#> 15 15 group4
#> 16 16 group4
#> 17 17 group4
#> 18 18 group4
#> 19 19 group4
#> 20 20 group4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM