【问题标题】:R Subset data frame and perform function based on columnsR子集数据框并基于列执行功能
【发布时间】:2013-07-17 19:35:54
【问题描述】:

样本数据。我还不确定如何在 SO 上使用代码块系统。

df <- data.frame(c(1,1,1,2,2,2,3,3,3),c(1990,1991,1992,1990,1991,1992,1990,1991,1992),c(1,2,3,3,2,1,2,1,3))
colnames(df) <- c("id", "year", "value")

生成一个简单的矩阵。

id year value
1 1990 1
1 1991 2
1 1992 3
2 1990 3
2 1991 2
2 1992 1
3 1990 2
3 1991 1
3 1992 3

我正在整理 R 子集问题,但无法弄清楚应用到它的 ddply 函数 {plyr} 的第二步。

逻辑:对于所有ID子组,找出最早时间点的最大值(即3)。

我对在这里使用什么语法感到困惑。通过搜索 SO,我认为 ddply 是最佳选择,但无法弄清楚如何。理想情况下,我的输出应该是一个 UNIQUE ID 的向量(因为只选择了一个,并带有整行。这对我来说在 R 中不起作用,但它是我能想到的最好的“逻辑”。

ddply( (ddply(df,id)), year, which.min(value) )

例如

id year value
1 1992 3
2 1990 3
3 1992 3

如果 3 不可用,则应采用下一个最高值(2 或 1)。有什么想法吗?

【问题讨论】:

    标签: r dataframe plyr


    【解决方案1】:

    您需要了解ddply 根据拆分变量将您的原始 data.frame 拆分为 data.frames。因此,它需要一个以 data.frame 作为参数和返回值的函数。

    library(plyr)
    ddply(df,.(id),function(DF) {res <- DF[which.max(DF$value),]
                                 res[which.min(res$year),]})
    
    #   id year value
    # 1  1 1992     3
    # 2  2 1990     3
    # 3  3 1992     3
    

    【讨论】:

    • 谢谢!我还没有用 R 写过很多函数,所以这就是我被赶上的地方。如果我理解的话,ddply 会生成一个数据框,该数据框可以由函数语句操作(如您在上面放置的)。
    • 没错,ddply 拆分为 data.frames,然后传递给函数。该函数将 data.frames 返回到 ddply,然后将它们组合起来。
    • 我已经返回这个你写过 4 次的函数了——这太完美了,Roland。
    【解决方案2】:

    我相信data.table 是最适合您的工具(出于速度和语法原因):

    library(data.table)
    dt = data.table(df)
    
    # order by year, and then take the first row for each id that has max 'value'
    dt[order(year), .SD[which.max(value)], by = id]
    #   id year value
    #1:  1 1992     3
    #2:  2 1990     3
    #3:  3 1992     3
    
    # if you're after speed, this slightly worse syntax is the current way of achieving it
    dt[dt[order(year), .I[which.max(value)], by = id]$V1]
    

    【讨论】:

    • 这似乎也很有效 - 它与 Roland 发布的结果相符。非常感谢eddi。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 2020-11-21
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    相关资源
    最近更新 更多