【发布时间】:2010-08-31 22:28:29
【问题描述】:
数据库$VAR 其值为 0 和 1。
如何重新定义数据框以便删除 1?
谢谢!
【问题讨论】:
-
您要删除值 1 还是删除值 1 的所有观测值?或者您想拆分数据框以使用 VAR == 0 和 VAR == 1 分隔观察结果?
-
我希望删除所有值为 1 的观察值,这样当我调用
database$VAR时,我只会得到 0。谢谢!
数据库$VAR 其值为 0 和 1。
如何重新定义数据框以便删除 1?
谢谢!
【问题讨论】:
database$VAR 时,我只会得到 0。谢谢!
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
【讨论】:
drop=FALSE。它会减慢这种方法的速度。
如果我有声誉的话,我会使用“子集”来支持答案:-)。您也可以直接使用逻辑向量进行子集化——不需要“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
【讨论】:
drop=FALSE。对我来说which 更快(使用 TRUE 或 FALSE)。
试试这个:
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 折叠成一个向量。
【讨论】:
database$VAR,我仍然会得到 1 和 0....
database 或将其分配给新变量。
data1base$NEW<- df 我收到错误:$(*tmp*`, "NEW", value = list(VAR = c(0 , 1, : 替换有5行,数据有819
database <- database[-which(database[,"VAR"]==1), , drop=FALSE]
subset 不合适有什么原因吗?对于训练有素的 R 用户来说,这似乎会更容易一些:使用您的样本数据,这应该可以工作:df.new <- subset(df, VAR == 0)。还是我错过了什么?显示新对象的结构表明df.new是一个data.frame:str(df.new)