1

我正在尝试将“母数据帧”细分为三个数据帧:称为 的母数据帧dfrm具有不同的变量,包括id(标识)、time(三个时间点)、一个数值变量Ht和一个fac具有 3 个级别的因子取决于 Ht。

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

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

我想创建第三个 data.frame,其中所有未在dfrm2or中选择的行dfrm3。直到现在我还没有成功。

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

4

2 回答 2

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
于 2013-08-11T16:07:12.433 回答
0

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

dfrm2 <- dfrm[dfrm$fac=="<30%", ]
dfrm3 <- dfrm[dfrm$fac=="<35%", ]
dfrm4 <- dfrm[dfrm$fac!="<30%" % dfrm$fac!="<35%", ]
于 2013-08-11T16:07:39.287 回答