【问题标题】:Keeping all columns when using ddply使用 ddply 时保留所有列
【发布时间】:2015-10-27 22:44:14
【问题描述】:

我有一个看起来像这样的ddplay 函数

myF <- ddply(.data = someDf,
                  .variables = ~X,
                  .fun = function(piece) {
                      as.Date(piece$myDate, "%d.%m.%Y") %>% which.min
})

我需要返回整个数据框,而不仅仅是包含变量 XYmyDate 的数据框。我如何告诉 ddply 它应该按照函数的说明对我的数据进行排序,但返回我初始 df 的每一列?

我运行操作的 df 看起来像

X    Y    c    d    myDate    
a1   12   bb   c    05.05.12
a1   14   cd   a    04.05.12
b1   12   ff   r    10.12.15
c1   15   ss   g    09.09.10
b1   12   aa   p    01.02.12

在 ddply 之后它应该看起来像这样

X    Y    c    d    myDate    
a1   14   cd   a    04.05.12
c1   15   ss   g    09.09.10
b1   12   aa   p    01.02.12

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    与@bramtayl 类似的答案,但也使用了过滤器。

    > library(dplyr)
    
    > new_df <- x %>%
    +  group_by(X) %>%
    +  mutate(myDate = as.Date(myDate, format = '%d.%m.%y')) %>%
    +  filter(myDate == min(myDate))
    
    > new_df
    Source: local data frame [3 x 5]
    Groups: X [3]
    
           X      Y      c      d     myDate
      (fctr) (fctr) (fctr) (fctr)     (date)
    1     a1     14     cd      a 2012-05-04
    2     c1     15     ss      g 2010-09-09
    3     b1     12     aa      p 2012-02-01
    
    > unique(x$X) %>% length == nrow(new_df)
    [1] TRUE
    
    > unique(x$X) %>% length == length(new_df)
    [1] FALSE
    

    【讨论】:

    • 这似乎行得通。但是,当我运行 unique(x$X) %&gt;% length 时,该结果的长度与您的代码返回的 df 的长度不同。那不应该。
    • 我相信你在这里错误地使用了length。如果您使用length(new_df),您将返回数据框中的列数......这是错误的。你想要nrow(new_df)。应该是一样的,你提供的数据也是一样的。
    • unique 没有给我一个df 回,而是一个向量!所以length 应该没问题。
    • 我将unique(x$X) %&gt;% lengthnrow(new_df) 进行了比较。但是,我的 unique(x$X) %&gt;% length 是 16030,我的 nrow(new_df) 是 42540。有什么想法可能是这里的问题吗?!
    【解决方案2】:

    一种解决方法,假设您的输出与输入的长度相同

    myF <- cbind( myF, 
                      ddply(.data = someDf,
                      .variables = ~X+Y,
                      .fun = function(piece) {
                          as.Date(piece$myDate, "%d.%m.%Y") %>% which.min
    })
    )
    

    这会将新信息附加到数据框末尾的列中。

    【讨论】:

    • 我的输出长度不一样。这就是ddply 的意义所在,不是吗? :)
    • 这取决于 :) 你能dput()你的数据,这样我们就可以看到你在处理什么?
    • 我添加了我的数据框的示意图示例
    【解决方案3】:

    你在寻找这样的东西吗?

    library(dplyr)
    
    df %>%
      group_by(X) %>%
      slice(myDate %>% 
              as.Date("%d.%m.%Y") %>% 
              which.min %>% 
              last)
    

    【讨论】:

    • 不。当我运行 unique(x$X) %&gt;% length 时,该结果的长度与您的代码返回的 df 的长度不同。那不应该是
    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 2020-06-18
    • 1970-01-01
    • 2022-11-23
    • 2020-04-25
    • 2012-12-19
    • 1970-01-01
    • 2018-03-04
    相关资源
    最近更新 更多