重新定义R中的数据帧

时间:2010-08-31 22:28:29

标签: r dataframe

数据库$ VAR 它的值为0和1。

如何重新定义数据框以删除1?

谢谢!

3 个答案:

答案 0 :(得分:3)

TMTOWTDI

使用subset

df.new <- subset(df, VAR == 0)

编辑:

David的解决方案似乎是我机器上最快的解决方案。子集似乎是最慢的。我甚至不会假装试图了解这些差异背后的情况:

> df <- data.frame(y=rep(c(1,0), times=1000000))
> 
> system.time(df[ -which(df[,"y"]==1), , drop=FALSE])
   user  system elapsed 
   0.16    0.05    0.23 
> system.time(df[which(df$y == 0), ])
   user  system elapsed 
   0.03    0.01    0.06 
> system.time(subset(df, y == 0))
   user  system elapsed 
   0.14    0.09    0.27 

答案 1 :(得分:2)

如果我有名声,我会使用“子集”来回答这个问题:-)。您也可以直接使用逻辑向量进行子集化 - 不需要“which”:

d <- data.frame(VAR = c(0,1,0,1,1))
d[d$VAR == 0, , drop=FALSE]

我很惊讶在至少一个案例中发现逻辑版本更快一点。 (我预计“哪个”版本可能会赢,因为R可能会为结果预先分配适当的存储量。)

> d <- data.frame(y=rep(c(1,0), times=1000000))
> system.time(d[which(d$y == 0), ])
   user  system elapsed 
  0.119   0.067   0.188 
> system.time(d[d$y == 0, ])
   user  system elapsed 
  0.049   0.024   0.074 

答案 2 :(得分:1)

试试这个:

R> df <- data.frame(VAR = c(0,1,0,1,1))
R> df[ -which(df[,"VAR"]==1), , drop=FALSE]
  VAR
1   0
3   0
R> 

我们使用which( booleanExpr )来获取您的条件所适用的索引,然后在这些索引上使用-1来排除它们,最后使用drop=FALSE来阻止我们data.frame的一个列折叠成矢量。