Помогите с сохраняющейся проблемой при использовании функции «подмножество» в R

Я хотел бы использовать функцию subset в R для извлечения небольших групп данных временных рядов панельных исследований.

Мои данные состоят из фрейма данных, состоящего из шести столбцов: район (8 районов), пол, возрастной интервал (4 группы), год, месяц и столбец подсчета.

Пример:

  District Gender Year Month AgeGroupNew TotalDeaths
1 Eastern  Female 2003     1           0           4
2 Eastern  Female 2003     1        01-4           1
3 Eastern  Female 2003     1       05-14           1
4 Eastern  Female 2003     1         15+          91
5 Eastern  Female 2003     2           0           4
6 Eastern  Female 2003     2        01-4           1

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

     District  Gender Year Month AgeGroupNew TotalDeaths
     Northern    Male 2003     1        01-4           0
     Northern    Male 2003     2        01-4           1
     Northern    Male 2003     3        01-4           0
     Northern    Male 2003     4        01-4           3
     Northern    Male 2003     5        01-4           4
     Northern    Male 2003     6        01-4           6
     Northern    Male 2003     7        01-4           5
     Northern    Male 2003     8        01-4           0
     Northern    Male 2003     9        01-4           1
     Northern    Male 2003    10        01-4           2
     Northern    Male 2003    11        01-4           0
     Northern    Male 2003    12        01-4           1
     Northern    Male 2004     1        01-4           1
     Northern    Male 2004     2        01-4           0

Собираюсь

     Northern    Male 2006    11        01-4           0
     Northern    Male 2006    12        01-4           0

До сих пор я пытался использовать это, благодаря тому, что DWin указал на это в предыдущий вопрос.

subset(datNew, subset=(District=="Eastern" &  Gender=="Female" &  AgeGroupNew=="01-4"))
[1] District    Gender      Year        Month       AgeGroupNew TotalDeaths
<0 rows> (or 0-length row.names)

Но R продолжает давать мне результат, как указано выше, чего не должно быть.

Я пробовал другие комбинации с успехом, но кажется, что использование «Района» в subset вызывает это <0 rows> (or 0-length row.names).

Это работает:

> head(subset(datNew, Year=="2004" & Month=="8" & AgeGroupNew =="0"))
         District Gender Year Month AgeGroupNew TotalDeaths
77       Eastern  Female 2004     8           0          10
269      Eastern    Male 2004     8           0           6
461  Khayelitsha  Female 2004     8           0          13
653  Khayelitsha    Male 2004     8           0          15
845  Klipfontein  Female 2004     8           0           7
1037 Klipfontein    Male 2004     8           0           6

но нет

> head(subset(datNew, District=="Eastern" & Gender=="Female" & AgeGroupNew =="0"))
[1] District    Gender      Year        Month       AgeGroupNew TotalDeaths
<0 rows> (or 0-length row.names)

Любая причина, по которой District вызывает это? Совершенно неправильно, что с такой комбинацией подмножества 0 строк - насколько мне известно, данных достаточно.

Я пробовал экспериментировать - и из других постов это на шаг ближе к тому, чего я хочу достичь, но все еще не работает:

> head(subset(datNew,datNew[[1]] %in% District[1] & Gender=="Female" & AgeGroupNew=="0"))
   District Gender Year Month AgeGroupNew TotalDeaths
1  Eastern  Female 2003     1           0           4
5  Eastern  Female 2003     2           0           4
9  Eastern  Female 2003     3           0           5
13 Eastern  Female 2003     4           0          12
17 Eastern  Female 2003     5           0           7
21 Eastern  Female 2003     6           0          13

При этом я не могу выбирать из других Районов, таких как "Южный", "Хаелитша" и т.д. На что бы я не меняла datNew[[1 or 2 or 3]] и District[[1 or 2 or 3]]. Я действительно не знаю, что %in% делает выше?

Я так застрял. Любая помощь по сборке.


person OSlOlSO    schedule 11.07.2011    source источник
comment
Я предполагаю, что ваши данные District содержат пробелы в конце каждой строки. Посмотрите на правильное выравнивание ваших образцов выше. Пол выровнен по букве r, а район выровнен на единицу влево. Проверьте свои данные на наличие пустого места.   -  person Andrie    schedule 11.07.2011
comment
Странный! Возможно, вы могли бы вместо этого рассмотреть возможность переключения районов на число?   -  person Christian Bøhlke    schedule 11.07.2011


Ответы (1)


Прогноз: Дайте нам результаты str(datNew$District[1]) и все будет раскрыто. Я предсказываю, что появится непечатаемый символ, возможно, завершающий пробел (или два).

Таким образом, с результатами str(...) правильный код будет таким:

subset(datNew, District=="Eastern " & Gender=="Female" & AgeGroupNew =="0")
person IRTFM    schedule 11.07.2011
comment
Это результаты. > str(datNew$District[1]) Factor w/ 8 levels "Eastern ","Khayelitsha ",..: 1 - person OSlOlSO; 11.07.2011
comment
Так что я был прав. Вы неправильно пишете уровень восточного фактора. - person IRTFM; 11.07.2011
comment
Хорошо, я вижу пробел в конце :) Итак, функция subset теперь работает. Спасибо @DWin @Andrie @ChristianBøhlke за помощь. Я, вероятно, трачу 8 часов из-за глупого пробела в конце. - person OSlOlSO; 11.07.2011
comment
Не связанный с этим вопрос - как решить этот вопрос. Отметить ли ваш ответ как правильный или добавить ответ на ваш вопрос с правильным кодом и пробелами в конце? (Просто хочу, чтобы система Stackoverflow была чистой и работала.) - person OSlOlSO; 11.07.2011
comment
Я опубликую это. Помимо использования str с каждой головоломкой, вы также можете использовать traceback() с каждым сообщением об ошибке (которого не было) и иногда выяснять, где вы должны искать более внимательно - person IRTFM; 11.07.2011