我有一个包含三个变量的数据框:ID
,group
和nominated_ID
。
我想知道group
所属的nominated_ID
。
我想象的是,对于每种情况,我们都会nominated_ID
,找到它等于ID
的情况,然后将原始情况下的nominated_Group
变量设置为等于匹配案例中的group
变量。 (如果没有匹配,请将其设置为NA)
如果没有循环可以做到这一点我不会感到惊讶,所以我对解决方案持开放态度。非常感谢你的帮助。知道我在发布之前确实试图寻找类似的问题。
答案 0 :(得分:4)
通过直接将结果分配到data.frame中的列,您可以在不使用cbind
的情况下一步完成此操作:
df$nominated_group <- with(df, group[match(nominated_ID, ID)])
df
ID group nominated_ID nominated_group
1 9 Odd 9 Odd
2 5 Odd 8 <NA>
3 2 Even 4 Even
4 4 Even 9 Odd
5 3 Odd 2 Even
我使用with
作为引用df列的便捷方式,而无需重复编写df$
。
答案 1 :(得分:3)
以下似乎有效;可能有更好的方法
> df <- data.frame(ID = c(9, 5, 2, 4, 3),
+ group = c("Odd", "Odd", "Even", "Even", "Odd"),
+ nominated_ID = c(9, 8, 4, 9, 2) )
> df
ID group nominated_ID
1 9 Odd 9
2 5 Odd 8
3 2 Even 4
4 4 Even 9
5 3 Odd 2
> nominated_Group <- df[match(df$nominated_ID, df$ID), ]$group
> newDF <- cbind(df, nominated_Group)
> newDF
ID group nominated_ID nominated_Group
1 9 Odd 9 Odd
2 5 Odd 8 <NA>
3 2 Even 4 Even
4 4 Even 9 Odd
5 3 Odd 2 Even
答案 2 :(得分:3)
您可以使用transform
,match
和数组索引以语法紧凑的方式执行此操作。使用@ Henry的数据框:
df <- transform( df, nominated_group = group[match(nominated_ID, ID)])
> df
ID group nominated_ID nominated_group
1 9 Odd 9 Odd
2 5 Odd 8 <NA>
3 2 Even 4 Even
4 4 Even 9 Odd
5 3 Odd 2 Even
答案 3 :(得分:2)
可能不是最“直观”的方式,但是如果你使用nominated_ID作为第一个副本的合并索引而ID作为第二个的by索引,那么将df
与df
合并也是有效的所有行。您需要删除第二个nominated_ID
列并重新排列顺序,以使内容符合上述答案:
merge(df,df, by.x=3, by.y=1, all.x=TRUE)[order(df$nominated_ID), c(2,3, 1, 4)]
ID group.x nominated_ID group.y
5 4 Even 9 Odd
3 5 Odd 8 <NA>
2 2 Even 4 Even
1 3 Odd 2 Even
4 9 Odd 9 Odd