R数据帧中的列的成对运算

时间:2017-07-09 01:25:11

标签: r dataframe dplyr

我有一个像这样的数据框

sample <- data.frame(x1=c(1,2),y1=c(2,1), x2=c(2,4),y2=c(3,4),x3=c(5,2),y3=c(1,6))

如何成对操作(一次总结x1&amp; y1,x2&amp; y2,x3&amp; y3,2列)以创建3个新列sum1,sum2,sum3?感谢

2 个答案:

答案 0 :(得分:0)

方法1

由于它是成对的,因此您可以使用mapply

创建两个引用对

的向量
p1 <- seq(1, 6, by = 2)
p2 <- seq(2, 6, by = 2)

然后使用mapply对所需列应用成对求和:

mapply(x = p1, y = p2, function(x, y) sample[[x]] + sample[[y]])

结果:

   [,1] [,2] [,3]
[1,]    3    5    6
[2,]    3    8    8`

方法2

如果您需要在示例表中输出成对运算,我还想结合使用包dplyrwrapr

require(dplyr)
require(wrapr)

newcols <- paste0(names(sample)[seq(1, 6, by = 2)], names(sample)[seq(2, 6, by = 2)])

for (i in c(1:3)) {
  wrapr::let(list(RES = newcols[i],
                  COL1 = names(sample)[i],
                  COL2 = names(sample)[i + 1]),
             sample <- dplyr::mutate(sample, RES = COL1 + COL2))}


sample

  x1 y1 x2 y2 x3 y3 x1y1 x2y2 x3y3
1  1  2  2  3  5  1    3    4    5
2  2  1  4  4  2  6    3    5    8

我懒得使用这些包,因为我觉得它更容易理解。但如果您因任何原因无法下载这些软件包。你可以用基础R:

来做
newcols <- paste0(names(sample)[seq(1, 6, by = 2)], names(sample)[seq(2, 6, by = 2)])

for (i in c(1:3)) {
             sample[newcols[i]] <- sample[, names(sample)[i]] + sample[, names(sample)[i + 1]]
}

答案 1 :(得分:0)

这个怎么样?

Foo.cpp