96

我有一个非常大的数据框,其中行作为观察值,列作为遗传标记。我想创建一个新列,其中包含使用 R 进行的每个观察的选定列数的总和。

如果我有 200 列和 100 行,那么我想创建一个新列,该列有 100 行,列 43 到 167 的总和。列有 1 或 0。新列包含总和每一行,我将能够对具有最多遗传标记的个体进行排序。

我觉得它接近于:

data$new=sum(data$[,43:167])
4

6 回答 6

129

您可以使用rowSums

rowSums(data)应该给你你想要的。

于 2010-10-21T21:08:46.820 回答
43

rowSums 函数(正如 Greg 提到的)会做你想做的事,但是你在你的答案中混合了子集技术,在使用“[]”时不要使用“$”,你的代码应该看起来更像:

data$new <- rowSums( data[,43:167] )

如果您想使用 sum 以外的函数,请查看 ?apply 以在行或列中应用通用函数。

于 2010-10-21T21:17:32.953 回答
9

我来到这里希望找到一种方法来获取数据表中所有列的总和,并在实施上述解决方案时遇到问题。一种在所有列中添加总和的列的方法使用以下cbind函数:

cbind(data, total = rowSums(data))

此方法total向数据添加一列,并避免在尝试使用上述解决方案对所有列求和时产生的对齐问题(有关此问题的讨论,请参见下面的帖子)。

向矩阵错误添加新列

于 2018-07-13T00:30:09.790 回答
2

我将尝试通过示例为您提供每种方法的经过时间:

mat = matrix(runif(4e6), ncol = 50)

apply 函数和 rowSums 之间的比较:

apply_func <- function(x) {
    apply(x, 1, sum)
}

r_sum <- function(x) {
    rowSums(x)
}

# Compare the methods
microbenchmark(
    apply_func = app(mat),
    r_sum = r_sum(mat), times = 1e5
)

------ 输出 -- 以毫秒为单位 --------

       expr       min        lq      mean    median        uq      max neval
 apply_func 207.84661 260.34475 280.14621 279.18782 294.85119 354.1821   100
      r_sum  10.76534  11.53194  13.00324  12.72792  14.34045  16.9014   100

如您所见,rowSums 函数的平均时间比 apply 函数的平均时间小 21 倍。如果矩阵的列太多,您会发现经过时间的差异可能更显着。

于 2021-12-14T18:48:38.543 回答
1

这也可能有所帮助,但最好的选择是毫无疑问的rowSums功能:

data$new <- Reduce(function(x, y) {
  x + data[, y]
}, init = data[, 43], 44:167)
于 2021-08-07T05:29:42.357 回答
1

您也可以使用janitor package中的adorn_totals函数。您可以根据您给 arg: where的值对列或行求和。

例子:

tibble::tibble(
a = 10:20,
b = 55:65,
c = 2010:2020,
d = c(LETTERS[1:11])) %>%
janitor::adorn_totals(where = "col") %>%
tibble::as_tibble()

结果:

# A tibble: 11 x 5
       a     b     c d     Total
   <int> <int> <int> <chr> <dbl>
 1    10    55  2010 A      2065
 2    11    56  2011 B      2067
 3    12    57  2012 C      2069
 4    13    58  2013 D      2071
 5    14    59  2014 E      2073
 6    15    60  2015 F      2075
 7    16    61  2016 G      2077
 8    17    62  2017 H      2079
 9    18    63  2018 I      2081
10    19    64  2019 J      2083
11    20    65  2020 K      2085
于 2021-12-03T10:30:43.247 回答