我正在寻找我的具体问题的答案,但我没有找到结论。我发现了这个: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个合作伙伴,并且有多个列应该从中传输值,因此每个单独的每行写入它会花费很多时间)。
我希望有人可以提供帮助。 谢谢!
答案 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