通过删除特定行来创建data.frame的子集

时间:2013-08-11 15:53:44

标签: r dataframe plyr subset

我正在尝试将“mother data.frame”细分为三个data.frames:名为dfrm的母数据框具有不同的变量,包括id(标识),{{1 (三个时间点),数值变量time和因子Ht,其中3个等级取决于Ht。

我使用fac函数创建了2个data.frames dfrm2dfrm3,对每个ddply变量具有一定级别的主题进行排序时间点:

fac

我想创建第三个data.frame,其中包含尚未在id <- rep(c(seq(1,50,1)),3) time <- factor(rep(c("day1", "day2", "day3"), c(50,50,50)), levels=c("day1", "day2", "day3"), labels=c("day1", "day2", "day3"), ordered=TRUE) Ht <- rnorm(150, mean=30, sd=3) A <- rnorm(150, mean=7, sd=10) df <- as.data.frame(cbind(id,time,Ht,A)) head(df) fac <- factor(cut(df$Ht, breaks=c(1,30,35,100), labels=c("<30%","<35%", ">35%"), include.lowest=TRUE)) dfrm <- as.data.frame(cbind(df,fac)) library(plyr) dfrm2 <- ddply(dfrm, "id", function(x) if(all(x$fac=="<30%")) x else NULL) nrow(dfrm2) [1] 18 dfrm3 <- ddply(dfrm, "id", function(x) if(all(x$fac=="<35%")) x else NULL) nrow(dfrm3) [1] 6 dfrm2中选择的所有行。到目前为止,我没有成功。

我认为这个想法可能是指示R根据尚未选择的dfrm3从母dfrm中删除行。有人可以帮我吗?

2 个答案:

答案 0 :(得分:2)

您可以使用split function

l<-split(df,dfrm$fac)
names(l)<-paste0("data",1:length(levels(dfrm$fac)))

根据评论更新:

 dfrm4<-dfrm[!(dfrm$id %in% dfrm2$id|dfrm$id %in% dfrm3$id),]
    > dim(dfrm4)
    [1] 117   5

答案 1 :(得分:0)

我认为plyr是R中几乎所有问题的解决方案,但在我看来这是一个例外;括号子集将更清晰&amp;更容易。

dfrm2 <- dfrm[dfrm$fac=="<30%", ]
dfrm3 <- dfrm[dfrm$fac=="<35%", ]
dfrm4 <- dfrm[dfrm$fac!="<30%" % dfrm$fac!="<35%", ]