我有一个非常大的数据框,其中行作为观察值,列作为遗传标记。我想创建一个新列,其中包含使用 R 进行的每个观察的选定列数的总和。
如果我有 200 列和 100 行,那么我想创建一个新列,该列有 100 行,列 43 到 167 的总和。列有 1 或 0。新列包含总和每一行,我将能够对具有最多遗传标记的个体进行排序。
我觉得它接近于:
data$new=sum(data$[,43:167])
您可以使用rowSums
rowSums(data)
应该给你你想要的。
rowSums 函数(正如 Greg 提到的)会做你想做的事,但是你在你的答案中混合了子集技术,在使用“[]”时不要使用“$”,你的代码应该看起来更像:
data$new <- rowSums( data[,43:167] )
如果您想使用 sum 以外的函数,请查看 ?apply 以在行或列中应用通用函数。
我来到这里希望找到一种方法来获取数据表中所有列的总和,并在实施上述解决方案时遇到问题。一种在所有列中添加总和的列的方法使用以下cbind
函数:
cbind(data, total = rowSums(data))
此方法total
向数据添加一列,并避免在尝试使用上述解决方案对所有列求和时产生的对齐问题(有关此问题的讨论,请参见下面的帖子)。
我将尝试通过示例为您提供每种方法的经过时间:
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 倍。如果矩阵的列太多,您会发现经过时间的差异可能更显着。
这也可能有所帮助,但最好的选择是毫无疑问的rowSums
功能:
data$new <- Reduce(function(x, y) {
x + data[, y]
}, init = data[, 43], 44:167)
您也可以使用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