簡體   English   中英

R數據幀中列的成對操作

[英]pairwise operation on columns in R dataframe

我有一個這樣的數據框

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`

方法二

如果您需要在示例表中輸出成對操作,我還喜歡將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]]
}

這個怎么樣?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM