[英]assign value from one vector to a group based on another vector in R
我们可以使用%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.