根据另一行

时间:2016-05-19 14:23:53

标签: r

我正在寻找我的具体问题的答案,但我没有找到结论。我发现了这个:Add column to Data Frame based on values of other columns,但这并不是我在特定情况下所需要的。 我真的是R的初学者,所以我希望也许有人可以帮助我或对我有好的暗示。

这是我的数据框的示例:

ID     answer  1.partnerID  
125    3       715        
235    4       845         
370    7       985          
560    1       950          
715    5       235          
950    5       560          
845    6       370          
985    6       125          

我试着在一个例子中描述我想做的事情: 在第一行是ID为125的人的数据。此人的第一个伙伴是ID为715的人。我想创建一个新列,其中包含每个人的合作伙伴的答案值。它应该是这样的:

ID     answer  1.partnerID  1.partneranswer    
125    3       715          5
235    4       845          6
370    7       985          6
560    1       950          5
715    5       235          4
950    5       560          1
845    6       370          7
985    6       125          3

所以R应该取列1.partnerID的值,在这种情况下是“715”并搜索行,其中“715”是列ID中的值(没有多次ID) 。 从该特定行开始,R应该从列回答中获取值(在该示例中为“5”)并将其放入新列“1.partneranswer”中,但是在人125的行中。 我希望有人能理解我想做的事情......

我的问题是我可以想象如何为每一行的每一行写这个,但我认为需要有一个简单的方法来为所有行一次这样做? (特别是因为在我的原始data.frame中,每个人有5个合作伙伴,并且有多个列应该从中传输值,因此每个单独的每行写入它会花费很多时间)。

我希望有人可以提供帮助。 谢谢!

2 个答案:

答案 0 :(得分:5)

一种解决方案是使用apply,如下所示:

df$partneranswer <- apply(df, 1, function(x) df$answer[df$ID == x[3]])

输出将如上所述。可能存在无循环方法。

编辑:使用match添加无环(矢量化答案):

df$partneranswer <- df$answer[match(df$X1.partnerID, df$ID)]
df
   ID answer X1.partnerID partneranswer
1 125      3          715             5
2 235      4          845             6
3 370      7          985             6
4 560      1          950             5
5 715      5          235             4
6 950      5          560             1
7 845      6          370             7
8 985      6          125             3

答案 1 :(得分:0)

更新:这可以通过自联接来完成;前两列定义了从ID到答案的映射关系,为了找到伙伴ID的答案,您可以将数据框与自身合并,并在partnerID上键入第一个数据帧,并键入第二个数据帧。 ID

假设df(稍微修改了列名):

df
#   ID answer partnerID
#1 125      3       715
#2 235      4       845
#3 370      7       985
#4 560      1       950
#5 715      5       235
#6 950      5       560
#7 845      6       370
#8 985      6       125


merge(df, df[c('ID', 'answer')], by.x = "partnerID", by.y = "ID")

#  partnerID  ID answer.x answer.y
#1       125 985        6        3
#2       235 715        5        4
#3       370 845        6        7
#4       560 950        5        1
#5       715 125        3        5
#6       845 235        4        6
#7       950 560        1        5
#8       985 370        7        6

旧答案: 如果ID和partnerID一对一地映射到彼此,您可以尝试:

df$partneranswer <- with(df, answer[sapply(X1.partnerID, function(partnerID) which(ID == partnerID))])

df
#   ID answer X1.partnerID partneranswer
#1 125      3          715             5
#2 235      4          845             6
#3 370      7          985             6
#4 560      1          950             5
#5 715      5          235             4
#6 950      5          560             1
#7 845      6          370             7
#8 985      6          125             3