簡體   English   中英

使用 rowSums 和 tidyverse 添加值

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM