2017-07-09 17 views
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)) 

我怎樣才能操作成對一個數據幀(總結X1 & Y1,X2 & Y2,X3 & Y3,2列同時)到創建3個新列sum1,sum2,sum3?由於

+0

你想成對的規則(也許更大的羣呢?)基於數字? – Nate

回答

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 

我懶得使用這些包,因爲我覺得它更容易理解。但是,如果您因任何原因無法下載這些軟件包。你可以用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]] 
} 
0

這個怎麼樣?

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))