[英]adding values using rowSums and tidyverse
我在尝试对 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 列之间的第一行中的所有值,第二行中第一列和第 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,我应该遵循相同的方法吗?
谢谢!
这是将数据转换为更长格式后执行此操作的一种方法,对于每个name
,我们创建一组n
行并取sum
。
library(dplyr)
library(tidyr)
n <- 2 #No of columns to bucket. Change this to 100 for your case.
dataset %>%
pivot_longer(cols = -name, names_to = 'col') %>%
group_by(name) %>%
group_by(grp = rep(seq_len(n()), each = n, length.out = n()), add = TRUE) %>%
summarise(value = sum(value, na.rm = TRUE)) %>%
#If needed in wider format again
pivot_wider(names_from = grp, values_from = value, names_prefix = 'col')
# name col1 col2 col3 col4
# <chr> <dbl> <dbl> <dbl> <dbl>
#1 A 2 2 2 1
#2 B 4 4 4 2
#3 C 3 6 3 3
#4 D 9 8 9 4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.