[英]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.