![](/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.