2016-04-13 2 views
0

Я новичок в R. Я работал с фреймом данных (по имени df1). HOUSE. NO , E1, D11, DC11 - это различные имена столбцов в кадре. Ниже приведен результат логического подмножества, которое я выполнил.Необъяснимое несоответствие в логическом подмножестве в R

df1 
    HOUSE.NO D11 DC11 E1 
75 16/215 2 2 NA 
76 15/262 1 1 2 
77 16/220 1 1 2 
78 14/13 1 1 1 
79  14/9 2 2 NA 
df1$HOUSE.NO[df1$E1==1&any(!df1$D11==1,!df1$DC11==1)] 
[1] NA  "14/13" NA 

Но для «14/13» значение, когда я индивидуально вычисляется значение логического, он вышел FALSE.

df1$E1[df1$HOUSE.NO=="14/13"]==1&any(df1$D11[df1$HOUSE.NO=="14/13"]!=1, df1$DC11[df1$HOUSE.NO=="14/13"]!=1) 
[1] FALSE 

Я не могу видеть, как это произошло. Я также самостоятельно проверил фрейм данных, и это имело смысл для того, чтобы оно стало ложным. Пожалуйста, дайте мне знать, почему это произошло.

+1

Пожалуйста, покажите воспроизводимый пример – akrun

+0

@akrun В моем случае, у меня нет никакого другого места, где это получилось. Вам нужно, чтобы я предоставил дополнительную информацию из фрейма данных, над которым я работаю? –

+0

Я не собираюсь показать весь набор данных. Если вы укажете количество первых шести строк или около того, что будет воспроизводить эту проблему, будет легко понять – akrun

ответ

1

Я думаю, что вы наблюдаете за тем, что any применяется ко всему вектору, а == применяется к каждому элементу вектора.

Например:

e1 <- c(1, 1, 1) 
d11 <- c(1, 2, 2) 
dc11 <- c(1, 1, 2) 
house <- c("14/13", "a", "b", "c") 

При тестировании этого

house[e1==1 & any(d11!=1, dc11!=1) ] 

все дома, как говорят, чтобы выполнить условие, которое является правильным. Но когда вы более внимательно смотрите только на номер дома 14/13, его E1 уверен в 1, но его D11 и DC11 равны 1. Это потому, что в сравнении, ориентированном на этот дом, в частности, нет другого дома в сравнении any для прохождения теста «any».

Другими словами: any(d11!=1, dc11!=1) возвращает один TRUE при нанесении на все дома, потому что (в обоих примерах) есть по крайней мере, на дом, для которых D11 или DC11 не равен 1. При объединении этот единственный TRUE с вектор booleans (здесь: c(TRUE, TRUE, TRUE)) с &, он возвращает вектор c(TRUE & TRUE, TRUE & TRUE, TRUE & TRUE).

Теперь, если вы сделаете операцию для номера дома «14/13», вы запустите (для части any) any(d11[house=="14/13"]!=1, dc11[house=="14/13"]!=1) и получите FALSE.

В заключение, команда, которую вы хотите запустить,

house[ e1[house=="14/13"]]==1 & any(d11!=1, dc11!=1) ] 

и не

house[ e1[house=="14/13"]]==1 & 
    any(d11[house=="14/13"]!=1, dc11[house=="14/13"]!=1) ]