[英]R Subset data frame and perform function based on columns
樣本數據。 我還不確定如何在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)。 有任何想法嗎?
你要明白, 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
我相信data.table
對你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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.