2015-10-06 58 views
0

我想通過向它應用兩個條件來對數據集進行子集合。當我附加數據幀時,應用第一個條件,分離數據幀,重新附加,應用第二個條件並再次分離,得到預期結果,一個包含9個觀察值的數據框。R中的連接/分離行爲非常奇怪

當然,在應用第二個條件之前,您通常不會分開/連接。所以我附上,將這兩個條件相互適用,然後分離。但現在的結果是不同的:這是一個有24個觀測值的數據框。除了其中的5個觀察值外,其餘所有數據都只由NA值組成。

我知道有很多關於使用attach的建議,並且我明白它很危險,因爲很容易忽略仍然處於活動狀態的附加語句。這裏我的觀點是另一回事。我看到一種我無法理解的行爲。我正在使用R Studio 0.99.465和64位-R 3.2.1。

因此,這裏的代碼,第一個版本是笨拙,但產生正確的結果(DF 9個觀察,所有的非NA):

df <- expand.grid(early_vvl=c(0,1), inter_churn=c(0,1), inter_new_contract=c(0,1), late_vvl=c(0,1), late_no_reaction=c(0,1)) 
    attach(df) 
    df <- df[(1-early_vvl) >= inter_churn + inter_new_contract + late_vvl,] 
    detach(df) 
    attach(df) 
    df <- df[early_vvl <= late_no_reaction,] 
    detach(df) 

現在有24個觀測產生的數據幀的一個,其中大部分僅由NA值組成:

df <- expand.grid(early_vvl=c(0,1), inter_churn=c(0,1), inter_new_contract=c(0,1), late_vvl=c(0,1), late_no_reaction=c(0,1)) 
attach(df) 
df <- df[(1-early_vvl) >= inter_churn + inter_new_contract + late_vvl,] 
df <- df[early_vvl <= late_no_reaction,] 
detach(df) 

我很困惑。有人明白爲什麼第二個版本會產生不同的結果嗎?

回答

3

看一看什麼這裏發生的情況:

attach(df) 
df <- df[(1-early_vvl) >= inter_churn + inter_new_contract + late_vvl,] 
length(early_vvl <= late_no_reaction) 
## [1] 32 
df <- df[early_vvl <= late_no_reaction,] 
detach(df) 

所以你的邏輯載體early_vvl <= late_no_reaction仍然使用原來的df,你附掛的。當子集data.frame第二次,邏輯比data.frame不再有行,它的行爲是這樣的:

df <- data.frame(x=1:5, y = letters[1:5]) 
df[rep(c(TRUE, FALSE), 5), ] 
##  x y 
## 1  1 a 
## 3  3 c 
## 5  5 e 
## NA NA <NA> 
## NA.1 NA <NA> 

你可以只使用&以避免該問題:

df <- expand.grid(early_vvl=c(0,1), inter_churn=c(0,1), inter_new_contract=c(0,1), late_vvl=c(0,1), late_no_reaction=c(0,1)) 
attach(df) 
df <- df[(1-early_vvl) >= inter_churn + inter_new_contract + late_vvl & early_vvl <= late_no_reaction,] 
detach(df) 
+3

......從而表明爲什麼要避免附加。 –

+0

非常感謝照明快速,清晰和全面的答案!這是我最後一次使用附件... – MightyCurious