2011-05-08 16 views
3

我有一個數據幀有三個變量:ID,groupnominated_ID。 我想知道的是group屬於nominated_ID英寸循環創建一個新的變量基於其他情況在R(非常基本)

我想象,對於每個情況下,我們採取nominated_ID,找到它等於ID的情況下,再設置nominated_Group變量在原來的情況下等於到匹配情況下的group變量。 (如果沒有匹配,請將其設置爲NA)

如果不用循環就可以完成此操作,我不會感到驚訝,所以我對解決方案持開放態度。非常感謝你的幫助。知道我在發佈之前嘗試尋找類似的問題。

回答

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$

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 
+0

我不確定協議是什麼(並希望得到通知),但我傾向於稱這是解決的答案,因爲它既好又先,同時注意並投票簡化了代碼(df,group [match(nominated_ID,ID)])'也許我是在@Prasad的'df < - transform(df,nominated_group = group [match(nominated_ID,ID)])'和@Andrie'df $ nominated_group <可以潛入後續問題......我如何創建一個「parent_group」變量,使得所有提名發生在同一個「parent_group」內? – 2011-05-08 18:33:14

3

您可以使用transformmatch和數組索引語法上緊湊的方式做到這一點。使用@亨利的數據幀:

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 
2

可能不是最「直觀」的方式,但合併如果你的使用nominated_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