获取数据帧中多列的成对和

时间:2014-09-23 22:38:44

标签: r dataframe rowsum

我有一个如下所示的数据框:

x<-data.frame(a=6, b=5:1, c=7, d=10:6)

> x
  a b c  d
1 6 5 7 10
2 6 4 7  9
3 6 3 7  8
4 6 2 7  7
5 6 1 7  6

我正在尝试获取列a&amp;列的总和bc&amp; d在另一个数据框中应该如下所示:

> new
  ab cd
1 11 17
2 10 16
3  9 15
4  8 14
5  7 13

我尝试了rowSums()函数,但它返回了每行所有列的总和,我尝试了rowSums(x[c(1,2), c(3,4)])但没有任何效果。请帮忙!!

2 个答案:

答案 0 :(得分:1)

您可以对列子集使用rowSums

作为数据框:

data.frame(ab = rowSums(x[c("a", "b")]), cd = rowSums(x[c("c", "d")]))
#   ab cd
# 1 11 17
# 2 10 16
# 3  9 15
# 4  8 14
# 5  7 13 

作为矩阵:

cbind(ab = rowSums(x[1:2]), cd = rowSums(x[3:4]))

对于更广泛的数据框,您还可以在列子集列表上使用sapply

sapply(list(1:2, 3:4), function(y) rowSums(x[y]))

对于所有成对列组合:

y <- combn(ncol(x), 2L, function(y) rowSums(x[y]))
colnames(y) <- combn(names(x), 2L, paste, collapse = "")
y
#      ab ac ad bc bd cd
# [1,] 11 13 16 12 15 17
# [2,] 10 13 15 11 13 16
# [3,]  9 13 14 10 11 15
# [4,]  8 13 13  9  9 14
# [5,]  7 13 12  8  7 13

答案 1 :(得分:0)

这是另一种选择:

> sapply(split.default(x, 0:(length(x)-1) %/% 2), rowSums)
      0  1
[1,] 11 17
[2,] 10 16
[3,]  9 15
[4,]  8 14
[5,]  7 13

0:(length(x)-1) %/% 2步骤会创建一组2个可与split一起使用的组。它还将处理奇数列(将最终列视为一组自己的列)。由于split的默认data.frame“方法”按行拆分,因此您需要指定split.default将列拆分为组。