我对 R 几乎是新手,很抱歉,如果我提出一些基本问题,但我找不到解决这个“简单”问题的方法:拥有一个包含患者的数据库(大数据库,2500 万行,14 列),我有几个每个“id”的行,例如以下结构:
"id" "birth_date" "treatment" "date_treatment"
123 2002-01-01 2 2011-01-03
123 2002-01-01 3 2011-10-03
124 2002-01-01 6 2009-11-07
124 2002-01-01 NA NA
... ..... ...... ........
1022 2007-01-01 4 2011-01-06
我必须使用 ff 包才能使用少量 RAM,因此所有进程都应该放入 ff 函数中。而且我想知道,对于每个单独的“id”,这是他/她接受治疗 = 2 或 4 时的最小“年龄”。所以,在每个单独的 id中,在通用代码中:
if(c(2,4) 中的治疗) 然后 min(date_treatment -birth_date)
我只想保留那些最小的“年龄”数据,也许还有 ID。
一种解决方案是:
age_c <- (data$date_treatment - data$birth_date)/365.25;
data$age_c <- age_c;
idx <- ffwhich( data, treatment %in% c(2,4) );
result <- data[idx,];
这将所有进程保持在 ff 中,并且没有内存问题,但是......我仍然需要找到一种方法来为每个 id 获取这些最小年龄...... ffdfdply 似乎能够做到这一点:
age_fun <- function(x){
min_ <- min.ff(x$age_c);
data.frame( age = min_);
}
result2 <- ffdfdply(x = data,
split = data$id,
FUN = function(x) age_fun(x),
BATCHBYTES = 5000,
trace=TRUE
);
这需要很长时间,也给了我很多不同的错误....
有什么解决办法吗?
这是一个在 SAS 或 SQL 中很容易解决的普遍问题,但我在 R 中找不到正确的组合。所以一般问题是:
如何在非常大的数据集中计算变量(行)的相同值(组)的行列函数???
谢谢 !!