2010-08-31 82 views
0

数据库$ VAR 其值为0和1's。重新定义R中的数据帧

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

谢谢!

+1

要删除值1还是删除了值为1的所有观测值?或者你是否想要将数据帧拆分为VAR == 0和VAR == 1分开的观测值? – Greg 2010-08-31 22:32:08

+0

我想要删除所有值为1的观测值,以便当我调用'database $ VAR'时,我只会得到0。谢谢! – Brian 2010-08-31 22:38:32

回答

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列成矢量。

+0

有趣但是如果我在这之后调用'database $ VAR',我仍然会得到1和0 .... – Brian 2010-08-31 22:46:30

+0

您必须将结果分配回数据库或将其分配给新变量。 – Greg 2010-08-31 22:57:29

+0

当我去的时候: 'data1base $ NEW < - df' 我得到错误: $ < - 。data.frame'('* tmp *',“NEW”,value = list(VAR = c (0,1,:替换有5行,数据有819 – Brian 2010-08-31 23:20:30

3

TMTOWTDI

使用subset

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

编辑:

大卫的解决方案似乎是我的机器上最快的。子集似乎是最慢的。我甚至不会假装尝试理解这是怎么回事下是考虑到这些差异:

> 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 
+0

在第二次计时中包含'drop = FALSE'。它会减慢这种方法。 – Marek 2010-09-01 14:32:16

2

我会使用“子集”给予好评的答案,如果我有口碑为它:-)。您也可以直接使用逻辑矢量子集 - 无需“这”:

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 
+0

用于计时代码的+1 – midtiby 2010-09-01 06:46:12

+0

您应该在计时中包含'drop = FALSE'。而对于我'哪个'更快(有TRUE或FALSE)。 – Marek 2010-09-01 14:14:05