示例数据。我还不确定如何在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中工作,但它是最好的&#34;逻辑&#34;我能想出来。
ddply( (ddply(df,id)), year, which.min(value) )
E.g。
id year value
1 1992 3
2 1990 3
3 1992 3
如果3不可用,则应采用下一个最高(2或1)。有什么想法吗?
答案 0 :(得分:2)
您需要了解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
答案 1 :(得分:0)
我相信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]