![](/img/trans.png)
[英]R: Applying functions to multiple named columns in a data frame - improvements?
[英]Applying logic to data frame columns in R
我希望我能令人滿意地解釋我的問題。 我可以讓R做我想做的事,但是感覺很笨拙,因此我正在尋找一種更好的方法來獲得相同的結果。
我有一個看起來像這樣的數據框(盡管如果它們能更好地工作,我也會向其他結構開放)。
subject <- c(1,1,3,3)
day <- c(3, 20, 1, 14)
status <- c(1, 1, 1, 3)
df <- cbind(subject, day, status)
我想找到一種最有效的方法來查看,例如,受試者1在第3天的狀態為1(是),或者測試受試者在20天的狀態是否為3以外的其他狀態。到目前為止,我的嘗試是可行的但笨拙和丑陋。
has_event <- function(i, j, data) {
any(data[(data[, "subject"] == i) & (data[, "status"] != 3), "day"] == j)
}
has_event(1, 3, df) # evaluates to TRUE
has_event(1, 4, df) # evaluates to FALSE
我認為這種方法不會走得太遠,因為從那里開始邏輯只會變得更加復雜。 我覺得我缺少一些非常簡單的數據調用方法。 例如,如果我想查看在特定的一天中有多少個主體的狀態不為3,則使用我的方法看起來像這樣:
length(unique(df[, "subject"],)) - length(which(df[, "status"] == 3 & df[, "day"] == 14))
那就是難以處理的。
總體目標是以一種可以按日期或主題輕松訪問事物的方式來格式化我的數據,但是我現在只是在摸索中,不確定要調查哪種途徑。
dplyr::filter()
怎么樣,但是請記住將矩陣轉換為data.frame。 只需將過濾條件一一添加。
df<-data.frame(df)
require(dplyr)
filter(df,status!=3,day==20)
subject day status
1 1 20 1
或與data.table
require(data.table)
data.table(df)[status!=3][day==20]
實際上,將其定時為10萬個dplyr
的速度更快,但是對於以下幾種簡單類型來說,兩者都很快:
df<-data.frame(subject=sample(1:5,100000,T),day=sample(1:20,100000,T),status=sample(1:10,100000,T))
> system.time(data.table(df)[status!=3][day==20])
user system elapsed
0.01 0.00 0.02
> system.time(filter(df,status!=3,day==20))
user system elapsed
0 0 0
使用sqldf
包:
df <- data.frame(df)
require(sqldf)
sqldf("select * from df where status!=3 and day=20")
subject day status
1 1 20 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.