2015-10-06 3 views
0

Я хочу подмножество DataFrame, применяя к нему два условия. Когда я присоединяю фрейм данных, применяю первое условие, отделяю фрейм данных, присоединяю его снова, применяю второе условие и снова отключаю, получаю ожидаемый результат, блок данных с 9 наблюдениями.Прикрепить/отсоединить в R поведение очень странно

Конечно, вы обычно не отсоединяли/прикрепляли перед применением второго условия. Поэтому я прикладываю, применяю два условия друг к другу, а затем отсоединяю. Но результат сейчас другой: это кадр данных с 24 наблюдениями. Все, кроме 5 из этих наблюдений, состоят исключительно из значений NA.

Я знаю, что есть много советов против использования приложения, и я понимаю, что это опасно, потому что легко потерять отслеживание прилагаемого заявления, все еще действующего. Моя точка зрения здесь другая; Я вижу поведение в приложении, которое я просто не могу понять. Я использую R Studio 0.99.465 с 64-бит-R 3.2.1.

Так вот код, первая версия, которая является неуклюжим, но дает правильный результат (ДФ с 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) 

Теперь один, который производит dataframe с 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

Смежные вопросы