【问题标题】:ddply multiple function arguments + namingddply 多个函数参数 + 命名
【发布时间】:2013-06-09 17:25:37
【问题描述】:

浏览其他问题 我几乎解决了我的问题,但在最后一关失败了......

使用 R

我有一个数据帧 (d),我通过 plyr 包中的 ddply 传递一个函数 (fd),这将按预期返回一个数据帧。在我的实际数据框中,我想将大量变量传递给函数,而不是多次调用它,我还想将相关的 col.names 提供给输出数据表。试图一步一步地做下面的工作......

样本数据:

d<-structure(list(date.time = structure(c(1367943040, 1367950947, 
1367950965, 1367950987, 1367951028, 1367951045, 1367959536, 1367960275, 
1367960413, 1367985859, 1368005216, 1368005233, 1368011698, 1368011931, 
1368012615, 1368033855), tzone = "", class = c("POSIXct", "POSIXt"
)), station = c("L5", "L5", "L5", "L5", "L5", "L5", "L7", "L7", 
"L7", "L7", "L5", "L5", "L7", "L7", "L7", "L7"), code = c(10891, 
10891, 10891, 10891, 10891, 10891, 10891, 10891, 10891, 10891, 
10888, 10888, 10888, 10888, 10888, 10888)), .Names = c("date.time", 
"station", "code"), row.names = c(2421L, 2466L, 2467L, 2468L, 
2469L, 2470L, 2472L, 2473L, 2474L, 2812L, 2837L, 2838L, 2859L, 
2860L, 2861L, 3219L), class = "data.frame")

我有一个函数来查找事件的第一次发生并返回该事件发生时的日期时间:

fd<- function(x, var){
  time<- (as.POSIXct(x$date.time [x$station == var] [1]))
  paste (as.POSIXct (time, origin="1970-1-1", tz='UTC'))
}

我将它传递给数据框:

ddply(d,'code',fd,"L7")

查找第一次记录站“L7”的日期时间并返回数据帧:

code                  V1
1 10888 2013-05-08 12:14:58
2 10891 2013-05-07 21:45:36

有没有一种更有效的方法来调用多个函数参数而不是编写多个函数调用。还要命名列,在“V1”上方会读作“L7”这样的东西(不起作用)......

ddply(d,'code',fd,c("L7", "F5"))   

到目前为止,我所拥有的并在一定程度上起作用的是:

data.frame(  
  ddply(d,'code',fd,"L7"),
  ddply(d,'code',fd,"L5")) 

返回:

   code          V1          code.1        V1.1
1 10888 2013-05-08 12:14:58  10888 2013-05-08 10:26:56
2 10891 2013-05-07 21:45:36  10891 2013-05-07 17:10:40

如你所见,“代码”是重复的

而且colnames不合适,我最后想要的是一个data.frame:

  code           M1                 M2
1 10888 2013-05-08 12:14:58  2013-05-08 10:26:56
2 10891 2013-05-07 21:45:36  2013-05-07 17:10:40

【问题讨论】:

    标签: r function plyr


    【解决方案1】:

    可能有更简单的方法可以做到这一点,但您可以将plyrreshape2 结合使用:

    require(plyr)
    require(reshape2)
    
    d2 <- ddply(d, c("code", "station"), function(df) {
      df[which.min(df$date.time),]
    })
    
    d3 <- dcast(d2, code ~ station, value.var = "date.time")
    
    d3
    
       code         L5         L7
    1 10888 1368005216 1368011698
    2 10891 1367943040 1367959536
    

    dcast 将 POSIXct 类转换为整数,因此您必须将它们转换回来:

    d3[,grepl("^L", colnames(d3))] <- lapply(d3[,grepl("^L", colnames(d3))], as.POSIXct,  
      origin="1970-10-01")
    
    d3
       code                  L5                  L7
    1 10888 2004-02-06 04:26:56 2004-02-06 06:14:58
    2 10891 2004-02-05 11:10:40 2004-02-05 15:45:36
    

    编辑

    我只是想到了一种不需要reshape2的更简单的方法:

      as.POSIXct(tapply(df$date.time, df$station, min), origin="1970-10-01")
    + })
    
       code                  L5                  L7
    1 10888 2014-02-05 04:26:56 2014-02-05 06:14:58
    2 10891 2014-02-04 11:10:40 2014-02-04 15:45:36
    

    所有这些都假设您确实希望您的输出在不同的列中列出每个站点的值。如果您可以接受站标识符本身是一个单独的列,那么 djhurio 的响应是最简单的。

    【讨论】:

    • 非常感谢,您的第一段代码效果很好,正在阅读 c("code", "station") 部分,但没有意识到它是如何工作的。 p.s.您的编辑代码无法正常工作,它为所有错误的代码返回相同的 date.time
    • 你的origin也有点出,应该是:origin="1970-1-1"
    • 感谢您的关注。我已经更改了上面的代码。编辑片段现在可以工作了。
    【解决方案2】:

    ddply(d, c("code", "station"), head, n = 1)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2018-06-10
      相关资源
      最近更新 更多