我为这个问题的标题道歉。我无法弄清楚如何简要描述我想做的事情。
我有类似的东西,> 8000行:
x y value_xy
A B 7
A C 2
B A 3
B C 6
C A 2
C B 1
我想创建一个新列value_yx,如下所示:
x y value_xy value_yx
A B 7 3
A C 2 2
B A 3 7
B C 1 1
C A 2 2
C B 1 1
对于x和y的每个值,我想要一个新列,找到y到x的值(因为y在x列的后面出现)。有时这些值是相等的,有时则不是。
我已经探索过使用for循环,ave()和其他几个函数,但我还是无法使它工作。
答案 0 :(得分:4)
试试merge
。 by.x
和by.y
参数指定要匹配的列,此处匹配列的顺序在by.y
中相反:
merge(x = df, y = df, by.x = c("x", "y"), by.y = c("y", "x"))
# x y value_xy.x value_xy.y
# 1 A B 7 3
# 2 A C 2 2
# 3 B A 3 7
# 4 B C 6 1
# 5 C A 2 2
# 6 C B 1 6
答案 1 :(得分:1)
看起来我很受欢迎,但是有了mapply的替代解决方案
df$value_yx = mapply(function(x_flip, y_flip) df[df$x == y_flip & df$y == x_flip,]$value_xy, df$x, df$y)
# x y value_xy value_yx
#1 A B 7 3
#2 A C 2 2
#3 B A 3 7
#4 B C 6 1
#5 C A 2 2
#6 C B 1 6
答案 2 :(得分:1)
xtabs
将返回一个值矩阵,该矩阵可以由前两列形成的两列字符值矩阵索引,并且可能是因子(因此需要as.character()
- 转化率:
> dfrm$value_yx <- xtabs(value_xy~x+y, dfrm)[
sapply(dfrm[2:1],as.character) ]
> dfrm
x y value_xy value_yx
1 A B 7 3
2 A C 2 2
3 B A 3 7
4 B C 6 1
5 C A 2 2
6 C B 1 6
---查看被索引的内容
> xtabs(value_xy~x+y, dfrm)
y
x A B C
A 0 7 2
B 3 0 6
C 2 1 0