簡體   English   中英

R子集數據幀並基於列執行功能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM