2010-08-31 116 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