【问题标题】:dplyr summarise Error in str.default(obj, ...) dims [product 11] do not match the length of object [3]dplyr 总结 str.default(obj, ...) dims [product 11] 中的错误与对象 [3] 的长度不匹配
【发布时间】:2016-07-28 14:26:59
【问题描述】:

我在使用 dplyr group_bysummarise 函数时遇到了一个非常令人沮丧的问题。

这是我的数据集:

> cum_ems_totals
Source: local data frame [12 x 4]

   Chamber Total_emmissions Treatment  Block
    <fctr>            <dbl>    <fctr> <fctr>
1        1        5769.0507         U      1
2        3        7790.1426        IU      1
3        4        5166.8992        AN      1
4        5        7625.7319        AN      2
5        6        1964.0970        IU      2
6        7        5052.1268         U      2
7        9        4207.5324        IU      3
8       10         470.7014        AN      3
9       12        5675.9171         U      3
10      14        5666.1678         U      4
11      15        2134.5002        AN      4
12      16        4093.4687        IU      4

> str(cum_ems_totals)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   12 obs. of  4 variables:
 $ Chamber         : Factor w/ 13 levels "1","3","4","5",..: 1 2 3 4 5 6 7 8 9 11 ...
 $ Total_emmissions: num [1:101, 1] 5769 7790 5167 7626 1964 ...
 $ Treatment       : Factor w/ 4 levels "U","IU","AN",..: 1 2 3 3 2 1 2 3 1 1 ...
 $ Block           : Factor w/ 5 levels "1","2","3","13",..: 1 1 1 2 2 2 3 3 3 5 ...

我现在想按治疗计算一些汇总统计数据:

cum_ems_summary <- cum_ems_totals %>% filter(Chamber != "10") %>% 
  group_by(Treatment) %>% 
  summarise(n = n(), Mean = mean(Total_emmissions, na.rm = TRUE),
                      SD = sd(Total_emmissions, na.rm = TRUE), SEM = SD/sqrt(n))

这给了我:

> cum_ems_summary
Source: local data frame [3 x 5]

  Treatment     n     Mean        SD       SEM
     <fctr> <int>    <dbl>     <dbl>     <dbl>
1         U     4 5540.816  329.0763  164.5381
2        IU     4 4513.810 2415.6355 1207.8178
3        AN     3 4975.710 2750.6038 1588.0618

到目前为止一切顺利。但是,如果我尝试使用 ggplot 绘制此数据,则会收到以下错误:

> ggplot(cum_ems_summary, aes(x = Treatment, y = Mean, fill = Treatment)) + geom_bar(stat = "identity")
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : 
  arguments imply differing number of rows: 3, 11

数据框的str 给出了这个:

> str(cum_ems_summary)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   3 obs. of  5 variables:
 $ Treatment: Factor w/ 4 levels "U","IU","AN",..: 1 2 3
 $ n        : int  4 4 3
 $ Mean     :
Error in str.default(obj, ...) : 
  dims [product 11] do not match the length of object [3]

我不明白这里发生了什么!有人可以帮忙吗?

【问题讨论】:

  • @Sumedh 做到了,但它仍然给我同样的错误
  • Total_emmissions 不是正则向量。它是一个单列矩阵。注意结构中的两个值 [1:101, 1] 将其强制转换为向量。
  • @PierreLafortune 我想知道[1:101,1] 是什么意思。有什么想法是怎么发生的? cum_ems_totals &lt;- cum_ems %&gt;% group_by(Chamber) %&gt;% summarise(Total_emmissions = last(cumulative_emissions))
  • @PierreLafortune 强制转换为向量就可以了。谢谢
  • 不知道它是怎么发生的。很难做到这一点。我必须看到它之前的一切。该修复程序已作为答案添加。

标签: r ggplot2 group-by dplyr summary


【解决方案1】:
#Reproduce error
str(cum_ems_summary)
# Error in str.default(obj, ...) : 
#   dims [product 11] do not match the length of object [3]

#Fix
cum_ems_totals$Total_emmissions <- c(cum_ems_totals$Total_emmissions)


#Try again
cum_ems_summary <- cum_ems_totals %>% filter(Chamber != "10") %>% 
  group_by(Treatment) %>% 
  summarise(n = n(), Mean = mean(Total_emmissions, na.rm = TRUE),
            SD = sd(Total_emmissions, na.rm = TRUE), SEM = SD/sqrt(n))

ggplot(cum_ems_summary, aes(x = Treatment, y = Mean, fill = Treatment)) + geom_bar(stat = "identity")

【讨论】:

    【解决方案2】:

    我刚刚遇到了同样的问题,并通过在末尾添加一个 mutate_if 来解决它,以防万一它有帮助:

    df2<- df%>% 
      group_by(group) %>% 
      mutate_each(funs(scale, mean)) %>% 
      mutate_if(is.matrix, as.vector)
    

    【讨论】:

      【解决方案3】:

      该错误消息是否与您的治疗有 4 个级别这一事实无关?当它应该有 3 个级别“U”、“IU”、“AN”并且分配的级别是 1、2、3 并且额外级别“..”没有分配给它时。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-29
        • 2020-06-24
        • 1970-01-01
        • 2019-05-04
        • 2022-10-05
        • 2020-06-02
        相关资源
        最近更新 更多