R:通过反向匹配变量,在数据框中填充一个新列

时间:2014-11-18 19:53:46

标签: r dataframe

我为这个问题的标题道歉。我无法弄清楚如何简要描述我想做的事情。

我有类似的东西,> 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()和其他几个函数,但我还是无法使它工作。

3 个答案:

答案 0 :(得分:4)

试试mergeby.xby.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