[英]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.