2015-10-06 61 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