【问题标题】:Redefine Data Frame in R在 R 中重新定义数据框
【发布时间】:2010-08-31 22:28:29
【问题描述】:

数据库$VAR 其值为 0 和 1。

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

谢谢!

【问题讨论】:

  • 您要删除值 1 还是删除值 1 的所有观测值?或者您想拆分数据框以使用 VAR == 0 和 VAR == 1 分隔观察结果?
  • 我希望删除所有值为 1 的观察值,这样当我调用 database$VAR 时,我只会得到 0。谢谢!

标签: r dataframe


【解决方案1】:

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。它会减慢这种方法的速度。
【解决方案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 

【讨论】:

  • 您应该在计时中包含drop=FALSE。对我来说which 更快(使用 TRUE 或 FALSE)。
【解决方案3】:

试试这个:

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&lt;- df 我收到错误:$(*tmp*`, "NEW", value = list(VAR = c(0 , 1, : 替换有5行,数据有819
  • 你必须使用database &lt;- database[-which(database[,"VAR"]==1), , drop=FALSE]
  • @Dirk Eddelbuettel - 在这种情况下subset 不合适有什么原因吗?对于训练有素的 R 用户来说,这似乎会更容易一些:使用您的样本数据,这应该可以工作:df.new &lt;- subset(df, VAR == 0)。还是我错过了什么?显示新对象的结构表明df.new是一个data.frame:str(df.new)
猜你喜欢
  • 2013-07-03
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 2011-04-06
相关资源
最近更新 更多