【问题标题】:How to sum column data every nth row, including non numerical data in Rstudio如何对每第 n 行的列数据求和,包括 Rstudio 中的非数字数据
【发布时间】:2019-05-08 00:05:08
【问题描述】:

我有一个由昆虫现场采样数据的 420 行和 37 列组成的数据框。我试图对每 5 行的列值求和,以便每 5 行变为 1。此外,我试图使我的数据框($site,$date,$plot)中的非数值“折叠”,以便它们适合由我提到的总和组成的一个新行。

我已尝试使用此线程的建议:

Summing columns on every nth row of a data frame in R

包括使用包 dplyr 的 summarize_each 函数以及作为 data.table 一部分的 gl 和 colSums。

我已经在我的整个数据框上尝试过这些

库(data.table) setDT(FinalData)[, as.list(colSums(.SD)), by = gl(ceiling(420/5), 5, 420)]

这给了我:

colSums(.SD) 中的错误:“x”必须是数字

and 

library(dplyr)
 FinalData %>%
   group_by(indx = gl(ceiling(420/5), 5, 420)) %>%
   summarise_each(funs(sum))

which gives me error: 
Error in Summary.factor(c(4L, 4L, 4L, 4L, 4L), na.rm = FALSE) : 
  ‘sum’ not meaningful for factors

  Site.Date.Plot  CarA  CarB    CarC...
1.SL.VI.1          0     0        1
2.SL.VI.1          0     0        0
3.SL.VI.1          0     6        0
4.SL.VI.1          0     0        3
5.SL.VI.1          1     0        0
...
every 5 rows has a different $Site.Date.Plot. I expect this:

  Site.Date.Plot  CarA  CarB    CarC...
1. SL.VI.1          1     6       4
2. SL.VI.2         ...   ...      ...

But I get the above error messages from above.

【问题讨论】:

  • 嗨,欢迎来到 SO!您能否提供一个数据样本,以便我们了解情况?看看how to make a reproducible example
  • 嗨,Calum,我在帖子中提供了一小部分数据,我应该发布更多吗?你需要我的整个数据表吗?
  • 最好使用dput,以便人们可以复制和粘贴。此外,包括 20 行可能会更好,以验证每 5 行有一个不同的 Site.Date.Plot。所以,dput(FinalData[1:20, 1:4]) 会很棒。

标签: r data-manipulation


【解决方案1】:

这行得通吗?

FinalData %>%
   group_by(Site.Date.Plot) %>% 
   summarise_all(list(sum))

这将保留第一列并对其余列求和。

【讨论】:

    【解决方案2】:

    如果您想保留第一列Site.Date.Plot,可以尝试使用mutate_at

    library(dplyr)
    
    FinalData %>%
      group_by(indx = gl(ceiling(420/5), 5, 420)) %>%
      mutate_at(2:37, sum, na.rm = TRUE) %>%
      slice(1)
    

    或者它也适用于summarise_at,但在这种情况下你会丢失第一列

    FinalData %>%
      group_by(indx = gl(ceiling(420/5), 5, 420)) %>%
      summarise_at(-1, sum, na.rm = TRUE)
    

    【讨论】:

    • mutate_at 绝对有效。有没有办法可以将输出作为新的数据帧而不只是在控制台中?非常感谢。
    • 只需将其分配给一个对象。 new_data <- FinalData %>% group_by(indx = gl(ceiling(420/5), 5, 420)) %>% mutate_at(2:37, sum, na.rm = TRUE) %>% slice(1)
    【解决方案3】:

    第一个问题是在您的data.tabledplyr 解决方案中,sum 函数在Site.Date.Plot 的因子上运行。这就是您收到错误的原因。

    第二个改进是您的因子Site.Date.Plot 每 5 行更改一次。换句话说,我们可以简单地按它进行分组,而不是创建不同的索引。

    这些解决方案未经测试,因为没有足够的样本数据。

    library(tidyverse)
    
     FinalData %>%
       group_by(Site.Date.Plot) %>%
       summarise_all(sum)
    
    library(data.table)
    
    setDT(FinalData)
    FinalData[, lapply(.SD, sum), by = 'Site.Date.Plot']
    
    #base R
    aggregate(x = FinalData[, -1], by = list(FinalData$Site.Date.Plot), FUN = sum)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-01
      • 2019-09-22
      • 2014-12-07
      • 2021-08-08
      • 2018-01-03
      相关资源
      最近更新 更多