循环根据R中的其他情况创建一个新变量(非常基本)

时间:2011-05-08 00:17:13

标签: r loops vectorization data-manipulation

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

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

如果没有循环可以做到这一点我不会感到惊讶,所以我对解决方案持开放态度。非常感谢你的帮助。知道我在发布之前确实试图寻找类似的问题。

4 个答案:

答案 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)

您可以使用transformmatch和数组索引以语法紧凑的方式执行此操作。使用@ 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索引,那么将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