【发布时间】:2020-02-21 01:15:59
【问题描述】:
我在尝试对 R 中的一堆列求和时遇到了一些问题。我正在分析一个巨大的数据集,因此我正在复制一个样本。假数据。
这是数据的样子(我有 800 列)。
library(data.table)
dataset <- data.table(name = c("A", "B", "C", "D"), a1 = 1:4, a2 = c(1,2,NaN,5), a3 = 1:4, a4 = 1:4, a5 = c(1,2,NA,5), a6 = 1:4, a8 = 1:4)
dataset
我想要做的是将 100 列的存储桶中的列相加,例如,第一列和第 100 列之间的第一行中的所有值,第一列和第 1 列之间的第一行中的所有值第 200 列,第 1 列和第 100 列之间的第二行中的所有值,等等。
使用我在此解决方案中使用rowSums 提供的示例数据。
dataset %>%
mutate_if(~!is.numeric(.x), as.numeric) %>%
mutate_all(funs(replace_na(., 0))) %>%
mutate(sum = rowSums(.[,paste("a", 1:3, sep="")])) %>%
mutate(sum1 = rowSums(.[,paste("a", 4:5, sep="")])) %>%
mutate(sum2 = rowSums(.[,paste("a", 6:8, sep="")]))
但我收到以下错误:
Error in `[.data.frame`(., , paste("a", 6:8, sep = "")) : undefined columns selected
因为数据不包括 a7 列。
原始数据在 a1 和 a800 之间缺少一堆列,因此解决此问题将是使其正常工作的关键。
处理和解决此错误的最佳方法是什么?
另外,关于我编写的代码,我还有几个问题:
有没有更聪明的方法来选择列 a1 和 a100 而不是使用这种方法
.[,paste("a", 1:3, sep="")]?我有兴趣按名称选择列。我不想通过列的位置来选择它,因为有时 a100 并不意味着那是第 100 列。另外,我将 NA 和 NaN 转换为 0,以便能够对行求和。我正在这样做
mutate_all(funs(replace_na(., 0))),丢失了我的第一行而不是包含值的名称。在不将第一行的字符串值更改为 0 的情况下替换 NA 和 NaN 的最佳方法是什么?我添加的列的类型是整数,因为我事先转换了它们
mutate_if(~!is.numeric(.x), as.numeric)。如果我有 dbl,我应该采用相同的方法吗?
谢谢!
【问题讨论】: