R программирование / получение числа переменных в столбце - - PullRequest
0 голосов
/ 24 апреля 2018

В настоящее время я прохожу курс обучения по очистке данных на Coursera: D

Первая викторина содержала этот вопрос: сколько объектов стоимостью более 1000 000 $? Глядя на кодовую книгу, становится ясно, что свойства перечислены в столбце VAL и им присвоен номер 24 для домов стоимостью, равной или превышающей 1 млн. Долларов.

Моя первая попытка решить этот вопрос выглядела так:

length(data$VAL[data$VAL=="24"])

однако это не дало мне правильный ответ. Случайно (и после некоторых нервных срывов) я попробовал это (и это сработало):

length(data$VAL[!is.na(data$VAL) & data$VAL=="24"])

Теперь у меня было правильное решение, но я действительно не понимаю, почему это работает. В моей первой попытке выше кажется, что все NA тоже были включены, хотя я указал для data$VAL=="24"

Кто-нибудь может уточнить, почему мое первое предположение не сработало, а второе сработало? Это кажется мне нелогичным. : /

С наилучшими пожеланиями и спасибо за ваши мысли, Dominic

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Пример данных:

data = data.frame(VAL=c('24','24','24',NA,NA))

Давайте сначала посмотрим на

data$VAL=="24"

, который возвращает

 [1] TRUE TRUE TRUE   NA   NA

Итак, когда вы делаете

data$VAL[data$VAL=="24"]

Мы говорим R включить из data$VAL все элементы, где data$VAL=="24" равно TRUE, и пропустить те, где оно FALSE (попробуйте, например, c(1,2,3)[c(TRUE,FALSE,TRUE)]). Для четвертого и пятого элемента вы указываете не TRUE или FALSE для включения элемента, а NA и NA. Итак, вы получите

[1] 24   24   24   <NA> <NA>

который действительно имеет длину 5. Когда вы делаете

data$VAL[!is.na(data$VAL) & data$VAL=="24"] 

вы указываете, что не хотите брать элементы, которые NA, и, следовательно, длина составляет 3.

Если мы сделаем один шаг назад, мы увидим, что мы хотим посчитать количество TRUE в data$VAL=="24". Мы также можем сделать это, например:

sum(data$VAL=="24",na.rm=TRUE)

, который возвращает 3, поскольку аргумент na.rm указывает, что мы хотим удалить NA из вектора перед суммированием. Надеюсь, это поможет!

0 голосов
/ 24 апреля 2018

Вектор data$VAL == "24" имеет значения, которые TRUE, FALSE или NA, в зависимости от того, равно ли data$VAL 24, что-то еще, но не NA или NA. Когда вы задаете вектор с использованием логического вектора, включается NA s, но сами значения становятся NA:

> a <- 1:5
> a[c(TRUE, FALSE, TRUE, FALSE, NA)]
[1]  1  3 NA

Ярлык для вашего случая был бы sum(data$VAL==24, na.rm = TRUE), который суммирует логический вектор, преобразовывая его в 0 и 1 и удаляя NA с.

...