3

我有一个包含三个变量的数据框:IDgroupnominated_ID. 我想知道group那个nominated_ID属于。

我想象对于每种情况,我们取nominated_ID,找到它等于 的情况ID,然后将nominated_Group原始情况下的group变量设置为匹配情况下的变量。(如果没有匹配,设置为NA)

如果可以在没有循环的情况下完成此操作,我不会感到惊讶,因此我对解决方案持开放态度。非常感谢你的帮助。知道我在发布之前确实尝试过寻找类似的问题。

4

4 回答 4

4

cbind您可以通过直接将结果分配给 data.frame 中的列来一步实现此目的,而无需使用:

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$.

于 2011-05-08T16:58:50.557 回答
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
于 2011-05-08T01:02:24.167 回答
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
于 2011-05-08T14:41:58.727 回答
2

可能不是最“直观”的方式,但如果您使用提名_ID 作为第一个副本的合并索引和 ID 作为第二个副本的索引并保留所有行,则合并dfdf有效。您需要删除第二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
于 2011-05-08T15:10:11.993 回答