我有这样成对操作
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 & Y1,X2 & Y2,X3 & Y3,2列同时)到创建3个新列sum1,sum2,sum3?由于
我有这样成对操作
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 & Y1,X2 & Y2,X3 & Y3,2列同时)到创建3个新列sum1,sum2,sum3?由于
方法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
如果您需要输出示例表中的成对操作,我还想联合使用包dplyr
和wrapr
。
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
我懒得使用这些包,因为我觉得它更容易理解。但是,如果您因任何原因无法下载这些软件包。你可以用base 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]]
}
这个怎么样?
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))
sample_new <- 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),sumx1y1=(sample$x1 + sample$y1),
sumx2y2=(sample$x2 + sample$y2),sumx3y3=(sample$x3 + sample$y3))
你想成对的规则(也许更大的群呢?)基于数字? – Nate