对 data.frame 或矩阵中的行求和

Posted

技术标签:

【中文标题】对 data.frame 或矩阵中的行求和【英文标题】:Sum rows in data.frame or matrix 【发布时间】:2011-04-28 20:38:43 【问题描述】:

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

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

我觉得它接近于:

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

【问题讨论】:

【参考方案1】:

我会通过一个例子来支持你每种方法的运行时间:

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 倍。你会发现如果矩阵的列太多,经过时间的差异可能会更显着。

【讨论】:

主要目标是不管我正在处理的数据集如何,应用于小矩阵的东西通常会应用于大基准。 感谢您的建议。我做了 times = 100。【参考方案2】:

您也可以使用 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

【讨论】:

【参考方案3】:

这也有帮助,但毫无疑问,最好的选择是 rowSums 函数:

data$new <- Reduce(function(x, y) 
  x + data[, y]
, init = data[, 43], 44:167)

【讨论】:

【参考方案4】:

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

cbind(data, total = rowSums(data))

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

Adding a new column to matrix error

【讨论】:

另见dplyr::mutate_all。【参考方案5】:

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

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

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

【讨论】:

我不知道为什么会出现这个错误:rowSums(incomeData) 中的错误:'x' must be numeric @munmunbb,您收到该错误是因为incomeData 不是数字。使用str(incomeData) 之类的东西来查看它是什么,然后可能将其转换为数字矩阵。【参考方案6】:

你可以使用rowSums

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

【讨论】:

对于 OP 问题data$new &lt;- rowSums(data[43:167]) 为了节省别人的时间,也许是:避免与函数 rowsum 混淆,它会做其他事情!

以上是关于对 data.frame 或矩阵中的行求和的主要内容,如果未能解决你的问题,请参考以下文章

矩阵的行乘积和矩阵的列和

使用积分图像有效地对矩阵行中的元素求和

为啥 data.frame 上的 "^" 返回一个矩阵而不是像 "*" 这样的 data.frame?

第四十一篇 Numpy的基本操作——聚合操作

十六:矩阵数字求和

如何对稀疏矩阵列表求和?