我对 r(来自 sas)比较陌生,我需要在每个组中选择不同数量的观察值。组由两个变量的值标识
ToSelect <- data.frame(
key1=c(1,1,1,1,1,2,2,2,2,2,2,2),
key2=c("a","a","b","b","b","a","a","a","a","b","b","b"),
var1=c(2,3,4,6,2,7,8,5,7,1,8,5)
)
NumObs <- data.frame(
key1=c(1,1,2,2),
key2=c("a","b","a","b"),
NumObs=c(1,2,2,1)
)
我试过(来自问题“为 R 中的每个级别选择前 80 个观察值”)
ToSelect <- merge(x=ToSelect,y=NumObs,by=c("key1","key2"))
library(plyr)
Selected <- ddply(ToSelect, .(key1,key2), head, n = NumObs)
这使
错误:长度(n)== 1L 不是 TRUE
这对专家来说可能是一个明显的错误(na scalar, NumObs a vector?)
从同一个问题,我试过:
Selected <- do.call(
rbind,
lapply(split(ToSelect, c(ToSelect$key1,ToSelect$key2)), head, NumObs)
)
这使
错误:长度(n)== 1L 不正确。另外:警告消息:在 split.default(x = seq_len(nrow(x)), f = f, drop = drop, ...) 中:数据长度不是拆分变量的倍数
所以,和以前一样的错误,加上多个东西,如果组的长度不同,我不能使用拆分?
然后我发现了“按组观察编号”的问题,我无法使 rle/sequence 答案在我的情况下起作用,但调整了 ddply 答案:
ToSelect <- ddply(ToSelect, .(key1, key2), function(z){
cbind(var1=z$var1,NumObs=z$NumObs,
data.frame(
SeqNum = seq_along(z$key2)
)
)
}
)
Selected <- ToSelect[ToSelect$SeqNum<=ToSelect$NumObs,c("key1","key2","var1")]
哪个有效。
显然我的真实数据要大得多,那么有没有更好的替代方法?谢谢!