【问题标题】:Unable to apply ddply-summarise in R correctly无法在 R 中正确应用 ddply-summarise
【发布时间】:2017-12-16 07:39:38
【问题描述】:

这里是新人,对 R 来说也是新人,所以请多多包涵。

我有一个类似这样的data.frame:

     time. variable     TEER
1    0.07    cntrl 234.2795
2    1.07    cntrl 602.8245
3    2.07    cntrl 703.6844
4    3.07    cntrl 699.4538
...
48   0.07    cntrl  234.2795
49   1.07    cntrl  602.8245
50   2.07    cntrl  703.6844
51   3.07    cntrl  699.4538
...
471  0.07  agr1111 251.9119
472  1.07  agr1111 480.1573
473  2.07  agr1111 629.3744
474  3.07  agr1111 676.6782
...
518  0.07  agr1111 251.9119
519  1.07  agr1111 480.1573
520  2.07  agr1111 629.3744
521  3.07  agr1111 676.6782
...
753  0.07  agr2222 350.1049
754  1.07  agr2222 306.6072
755  2.07  agr2222 346.0387
756  3.07  agr2222 447.0137
757  4.07  agr2222 530.2433
...
802  2.07  agr2222 346.0387
803  3.07  agr2222 447.0137
804  4.07  agr2222 530.2433
805  5.07  agr2222 591.2122

我正在尝试将ddply() 应用于此数据框,以获取具有平均值和标准误差(稍后绘制)的新数据框,如下所示:

> ddply(data_melt, c("time.", "variable"), summarise,
mean = mean(TEER), sd = sd(TEER),
sem = sd(TEER)/sqrt(length(TEER)))

作为输出数据框,我得到的 TEERmean 列中的值与原始数据框的第一行中的值相同,而在 sdsem 列中的值相同。还有一个错误:

警告信息:

levels<-(*tmp*, value = if (nl == nL) as.character(labels) else paste0(labels, : 不推荐使用因子中的重复级别

看起来该函数只遍历数据框的第一部分,而不费心查看time.variable 组的重复项?

我已经尝试在这里查看类似问题的解决方案,但似乎没有任何效果。我错过了什么还是这是一个合法的问题?

感谢任何帮助/提示。

P.S 如果我对问题的解释不够连贯,请告诉我,我会尽量详细说明。

【问题讨论】:

  • 第二个参数应该是ddply()内的“变量”,它代表group-by变量。还要确保你只加载了这个包.. sumarize 也在 Hmiscdplyr 中,因此这个警告
  • 将其更改为“变量”。错误:nrow(labels) == length(null) is not TRUE 除了之前的相同警告消息外还出现。
  • 它应该可以工作.. 确保您的会话命名空间正在调用 plyr::summarise 本身
  • 确保只加载了 plyr 包,但仍然是同样的问题。另外,您说第二个参数应该只是“变量”,但我也希望它们也按时间分组,因此 c("time.", "variable").

标签: r plyr summarize


【解决方案1】:

我想我找到了解决问题的方法。

最初,当我加载数据框时,每个变量(“cntrl”、“agr1111”、“agr2222”)附近都有一个唯一的字母和数字(“A1”、“A2”、“B1”、 “B2”),因此,看起来像这样:“cntrl.A1”,“agr1111.B2”。而不是使用gsub从它们中减去字母数字,我尝试使用filtergrepl来然后隔离我需要的某些行和summarise。 代码如下:

library(dplyr)
dt_11 <- dt %>%
        group_by(time.) %>%
        filter(grepl("agr1111", variable)) %>%
        summarise(avg_11 = mean(teer), 
                  sd_11 = sd(teer),
                  sem_11 = sd(teer)/sqrt(length(teer)))

这只会给我一个带有一组变量(“agr1111”)的数据框,我必须再做两次,对于“cntrl”和“agr2222”,因此会产生 3 个数据框。但我敢肯定,我将能够合并数据框或将它们分别绘制在同一个图表上。

【讨论】:

    【解决方案2】:

    这不适合作为答案,但太长了,不能作为评论:

    我运行了您的确切代码,一切正常!

    > ddply(dt, c("time.", "variable"), summarise,
    +       mean = mean(TEER), sd = sd(TEER),
    +       sem = sd(TEER)/sqrt(length(TEER)), count = length(TEER))
    #time. variable     mean sd sem count
    # 0.07  agr1111 251.9119  0   0     2
    # 0.07  agr2222 350.1049 NA  NA     1
    # 0.07    cntrl 234.2795  0   0     2
    # 1.07  agr1111 480.1573  0   0     2
    # 1.07  agr2222 306.6072 NA  NA     1
    # 1.07    cntrl 602.8245  0   0     2
    # 2.07  agr1111 629.3744  0   0     2
    # 2.07  agr2222 346.0387  0   0     2
    # 2.07    cntrl 703.6844  0   0     2
    # 3.07  agr1111 676.6782  0   0     2
    # 3.07  agr2222 447.0137  0   0     2
    # 3.07    cntrl 699.4538  0   0     2
    # 4.07  agr2222 530.2433  0   0     2
    # 5.07  agr2222 591.2122 NA  NA     1
    > sessionInfo()
    #other attached packages:
    #[1] plyr_1.8.4 
    

    你能更新到最新版本的packaes吗?我不确定您的问题的原因。我希望您了解sd 的实际计算方式以及为什么会出现`NA~。(提示:查看计数列)

    【讨论】:

    • 首先感谢您的帮助,但这实际上表明代码不起作用。均值与第一行的原始值相同。并且 sd 和 sem 列是 0,这不是他们应该的。编辑:您使用了多少示例数据?足够获得手段,sd 和 sem 还是没有?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 2014-03-06
    • 2012-06-02
    • 1970-01-01
    相关资源
    最近更新 更多