我有两列关于研究参与者ID的信息。 ID
列包含数字的递增顺序,因为主题都是不同的人。第二列new_ID
包含有关哪些ID对应于同一个人的信息。不幸的是,它们不是按顺序排列。
ID <- c(1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6)
new_ID <- c(8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 10, 10, 10, 10, 10, 10, 10)
data.frame(ID, new_ID)
# ID new_ID
#1 1 8
#2 1 8
#3 1 8
#4 1 8
#5 2 10
#6 2 10
#7 2 10
#8 2 10
#9 2 10
#10 2 10
#11 3 8
#12 3 8
#13 3 8
#14 3 8
#15 3 8
#16 4 4
#17 4 4
#18 4 4
#19 4 4
#20 4 4
#21 4 4
#22 5 5
#23 5 5
#24 5 5
#25 5 5
#26 6 10
#27 6 10
#28 6 10
#29 6 10
#30 6 10
#31 6 10
#32 6 10
我在下面报告了我要实现的目标,即根据前两列中的信息分配新的ID(final_ID
)。任何帮助将不胜感激(最好使用dplyr
)!
# ID new_ID ID_final
#1 1 8 1
#2 1 8 1
#3 1 8 1
#4 1 8 1
#5 2 10 2
#6 2 10 2
#7 2 10 2
#8 2 10 2
#9 2 10 2
#10 2 10 2
#11 3 8 1
#12 3 8 1
#13 3 8 1
#14 3 8 1
#15 3 8 1
#16 4 4 4
#17 4 4 4
#18 4 4 4
#19 4 4 4
#20 4 4 4
#21 4 4 4
#22 5 5 5
#23 5 5 5
#24 5 5 5
#25 5 5 5
#26 6 10 2
#27 6 10 2
#28 6 10 2
#29 6 10 2
#30 6 10 2
#31 6 10 2
#32 6 10 2
答案 0 :(得分:2)
这里也是data.table
解决方案。
编辑:应OP的要求,也添加了dplyr
解决方案。
library(data.table)
ID <- c(1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6)
new_ID <- c(8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 10, 10, 10, 10, 10, 10, 10)
d <- data.table(ID, new_ID)
d[, ID_final := min(.SD[,ID]), new_ID]
d
#> ID new_ID ID_final
#> 1: 1 8 1
#> 2: 1 8 1
#> 3: 1 8 1
#> 4: 1 8 1
#> 5: 2 10 2
#> 6: 2 10 2
#> 7: 2 10 2
#> 8: 2 10 2
#> 9: 2 10 2
#> 10: 2 10 2
#> 11: 3 8 1
#> 12: 3 8 1
#> 13: 3 8 1
#> 14: 3 8 1
#> 15: 3 8 1
#> 16: 4 4 4
#> 17: 4 4 4
#> 18: 4 4 4
#> 19: 4 4 4
#> 20: 4 4 4
#> 21: 4 4 4
#> 22: 5 5 5
#> 23: 5 5 5
#> 24: 5 5 5
#> 25: 5 5 5
#> 26: 6 10 2
#> 27: 6 10 2
#> 28: 6 10 2
#> 29: 6 10 2
#> 30: 6 10 2
#> 31: 6 10 2
#> 32: 6 10 2
#> ID new_ID ID_final
library(dplyr)
df <- data.frame(ID, new_ID)
df <- df %>% group_by(new_ID) %>%
mutate(ID_final = min(ID))
df
#> # A tibble: 32 x 3
#> # Groups: new_ID [4]
#> ID new_ID ID_final
#> <dbl> <dbl> <dbl>
#> 1 1 8 1
#> 2 1 8 1
#> 3 1 8 1
#> 4 1 8 1
#> 5 2 10 2
#> 6 2 10 2
#> 7 2 10 2
#> 8 2 10 2
#> 9 2 10 2
#> 10 2 10 2
#> # ... with 22 more rows
由reprex package(v0.3.0)于2019-09-30创建
答案 1 :(得分:0)
您要做的是为每个new_ID找到正确的ID,然后加入该映射。
final_id_map <- df %>% group_by(new_ID) %>% summarise(ID_final=min(ID))
> final_id_map
# A tibble: 4 x 2
new_ID ID_final
<dbl> <dbl>
1 4 4
2 5 5
3 8 1
4 10 2
那你就可以做一个
df %>% join(final_id_map)
产生所需的输出。