2015-12-27 3 views
1

Я новичок в R и изучаю несколько способов подмножества данных. Я головоломка от разницы в количестве совпадений, используя приведенное ниже в Данных Ресторана (RestData), заданное zipcode.Подмножество в R возвращает разные значения, используя% in% vs. == operator

> nrow(restData[restData$zipCode %in% c("21212","21213"),]) 
# [1] 59 
> nrow(restData[restData$zipCode == c("21212","21213"),]) 
# [1] 26 

>Warning message: 
In restData$zipCode == c("21212", "21213") : 
longer object length is not a multiple of shorter object length 

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

fileURL <- "https://data.baltimorecity.gov/api/views/k5ry-ef3g/rows.csv?accessType=DOWNLOAD" 
download.file(fileURL, destfile = "./Rdata/restaurants.csv", method = "curl") 
restData <- read.csv("./Rdata/restaurants.csv") 
+5

Вы искали? ?????????? –

+3

Вы также можете поэкспериментировать: 'x = 1: 5; x% в% c (1,3); x == c (1,3); x == c (3,1); x == 1; x == 3; x == 1 | х == 3; x [x% в% c (1,3)]; x [x == c (3,1)] 'и т. д. – eipi10

+0

Я понимаю, что вы имеете в виду, спасибо – Nico

ответ

2

Вы не получают одни и те же ответы, потому что обе линии не делать то же самое! Первый из них является правильным, если вы хотите индексировать позиции RestData, где почтовый индекс равен "21212" или "21213". См. ?"%in%" для более подробной информации.

Во второй строке важно знать, что R будет «перерабатывать» элементы более короткого вектора, когда это необходимо для двоичной операции. Например, 1:6 + 1:2 будет перерабатывать второй вектор (длиной 2), чтобы сделать его вектором длины 6, поэтому вы действительно делаете 1:6 + rep(1:2, length=6). В вашем случае вы делаете

restData$zipCode == rep(c("21212", "21213"), length=nrow(restData)) 

a сравнение делается элемент за элементом. Итак, это говорит вам, что нечетные позиции: "21212" или четные позиции: "21213". Предупреждение, которое вы получаете, важно, потому что говорит, что вы сравниваете вектор нечетной длины с вектором четной длины. В некоторых случаях рециркуляция может быть полезна, например, restData$zipCode[c(TRUE, FALSE)] будет извлекать только нечетные позиции.

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