我有一个数据框df
:
id1 id2 action
1 2 10
1 3 11
1 4 21
2 1 6
...
这意味着,用户id1
对用户10
执行某些操作(id2
),并id2
对6
执行某项操作(id1
) }。
现在我想创建一个名为partner_action
的新列,它基本上记录了合作伙伴的行为。所以它看起来像:
id1 id2 action partner_action
1 2 10 6
2 1 6 10
1 3 11 9
3 1 9 11
我试过了:
df$partner_action = df[df$id2 == df$id1,]$action
但当然,它不起作用。
我想要制作df
的副本,名为df_copy
然后:
df$partner_action = df_copy[df_copy$id1 == df$id2,]$action
但有更好的方法吗?
答案 0 :(得分:1)
基本上,您希望将df
与自身合并,将(id2, id1)
对与(id1, id2)
对匹配。您可以使用merge
或match
:
df$partner_action <- with(df, action[match(paste(id2, id1), paste(id1, id2))])
df
# id1 id2 action partner_action
# 1 1 2 10 6
# 2 2 1 6 10
# 3 1 3 11 9
# 4 3 1 9 11
数据:
(df <- data.frame(id1=c(1, 2, 1, 3), id2=c(2, 1, 3, 1), action=c(10, 6, 11, 9)))
# id1 id2 action
# 1 1 2 10
# 2 2 1 6
# 3 1 3 11
# 4 3 1 9
答案 1 :(得分:0)
for(i in 1:nrow(df))
{df[i,4]<-df[which(df$id1==df[i,2]&df$id2==df[i,1]),3]}