1

我有一个看起来像这样的数据框:

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&bc&的总和,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)])但没有任何效果。请帮忙!!

4

2 回答 2

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
于 2014-09-23T22:39:52.207 回答
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。它还将处理奇数列(将最后一列视为自己的一组)。由于按行拆分的 s 有不同的默认split“方法” data.frame,因此您需要指定split.default将列拆分为组。

于 2014-09-23T23:25:09.453 回答