【问题标题】:Why doesn't rowSums work on data frame created using pivot_wider in R?为什么 rowSums 不适用于在 R 中使用 pivot_wider 创建的数据框?
【发布时间】:2021-03-25 13:49:10
【问题描述】:

我正在尝试计算一个大型数据集的剩余总容量和平均容量,我认为这将是一个简单的例子,即在我使用 pivot更宽创建的数据框上使用 rowSums 和 rowMeans,但我一直遇到同样的错误。

df<-data.frame("parent"=c("001","001","001","001","002","002","002","002",
                     "003","003","003","003","004","004","004","004"),"tube"=c("tube1",
                      "tube2","tube3","tube4","tube1","tube2","tube3","tube4",
                      "tube1","tube2","tube3","tube4","tube1","tube2","tube3","tube4"),
                     "microlitres"=c(100,120,60,100,NA,200,100,120,
                    60,100,120,40,100,120,400,NA))

pivot_wider(df,names_from = tube,values_from = microlitres)->df

df$sum<-rowSums(df,na.rm=TRUE)

我得到“错误:x 必须是数字”,然后当我将代码更改为

df$sum<-rowSums(as.numeric(df),na.rm=TRUE)

我得到“错误:列表对象不能被强制加倍”。

我在谷歌上搜索了很长时间,但没有发现任何有用的信息。我敢肯定有一个简单的修复,但我只是看不到它。我尝试过将 mutate 与嵌套的 rowSums 一起使用,我尝试过 unlist(),并将其转换为矩阵。我将非常感谢任何帮助和建议!

【问题讨论】:

    标签: r


    【解决方案1】:

    我希望输出是您想到的:

    library(dplyr)
    
    df %>%
      rowwise() %>%
      mutate(sum_cols = sum(c_across(tube1:tube4), na.rm = TRUE),
             mean_cols = mean(c_across(tube1:tube4), na.rm = TRUE))
    
    # A tibble: 4 x 7
    # Rowwise: 
      parent tube1 tube2 tube3 tube4 sum_cols mean_cols
      <chr>  <dbl> <dbl> <dbl> <dbl>    <dbl>     <dbl>
    1 001      100   120    60   100      380       95 
    2 002       NA   200   100   120      420      140 
    3 003       60   100   120    40      320       80 
    4 004      100   120   400    NA      620      207.
    
    

    【讨论】:

      【解决方案2】:

      这应该可行:

      df$sum &lt;- rowSums(sapply( df, as.numeric), na.rm=TRUE)

      问题在于pivot_wider 默认将某些列视为字符,而as.numeric() 将向量作为输入。

      > df
      # A tibble: 4 x 6
        parent tube1 tube2 tube3 tube4   sum
        <chr>  <dbl> <dbl> <dbl> <dbl> <dbl>
      1 001      100   120    60   100   762
      2 002       NA   200   100   120   422
      3 003       60   100   120    40   646
      4 004      100   120   400    NA   624
      

      【讨论】:

      • 不幸的是,这不适用于我的原始数据,但了解这些函数的行为非常有帮助,因为我认为我有时会在这方面遇到困难,所以谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      • 2020-04-27
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      相关资源
      最近更新 更多