Мой фрейм данных выглядит так:
ID | value A | value B
1 | A1 | F
1 | A2 | N
1 | A3 | B
1 | A4 | S
2 | A1 | B
2 | A2 | G
2 | A3 | N
3 | A1 | F
3 | A2 | H
3 | A3 | J
3 | A4 | N
Итак, у меня есть 4 строки для одного идентификатора в каждой. Я пытаюсь использовать функцию dcast (), но она работает, только если все идентификаторы имеют одинаковое количество строк. Идентификатор № 2 будет ошибкой в этом примере. Есть ли простой способ найти все идентификаторы, которые имеют больше или меньше 4 строк?
Или, может быть, есть ли способ заставить функцию dcast игнорировать ошибки?
Первоначально я пытаюсь изменить структуру данных, чтобы получить что-то вроде этого:
ID | A1 | A2 | A3 | A4
1 | F | N | B | S
2 | B | G | N | NA
3 | F | H | J | N
Очевидно, функция dcast () из пакета reshape2 не работает с неправильными идентификаторами. Это дает мне следующее сообщение об ошибке: «Функция агрегации отсутствует: по умолчанию длина» Но с меньшей частью моего набора данных - у которого нет этих нерегулярных идентификаторов - это работает. Есть идеи?
Или может быть идея, как изменить мой dataframe без использования dcast? Спасибо!
Я работаю на Mac со следующими (package-) версиями:
sessionInfo()
R version 2.14.1 (2011-12-22)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
locale:
[1] de_DE.UTF-8/de_DE.UTF-8/de_DE.UTF-8/C/de_DE.UTF-8/de_DE.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] reshape2_1.2.1 plyr_1.7.1
loaded via a namespace (and not attached):
[1] stringr_0.6
Все значения первого столбца являются целыми числами, остальные значения символов.
sapply(x, class)
ID fach01 f01_lp
"integer" "character" "character"
Что касается воспроизводимого примера:
Надеюсь, это поможет (я использовал свой исходный фрейм данных), однако, если я использую только первые 500 строк, фрейм данных dcast () работает отлично, проблема возникает, когда я пытаюсь использовать весь фрейм данных, содержащий около 140000 строк.
df <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L,
3L, 3L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 7L, 7L,
7L, 7L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L), A = c("2.LF",
"1.LF", "3.PF", "4.PF", "3.PF", "1.LF", "2.LF", "3.PF",
"4.PF", "1.LF", "2.LF", "3.PF", "1.LF", "4.PF", "2.LF", "1.LF",
"2.LF", "4.PF", "3.PF", "1.LF", "3.PF", "2.LF", "4.PF", "3.PF",
"4.PF", "1.LF", "2.LF", "4.PF", "2.LF", "3.PF", "1.LF", "1.LF",
"2.LF", "3.PF", "4.PF"), B = c("Mu/Ku",
"Fs", "2.AF", "NW", "DE", "2.AF", "MA", "Fs", "2.AF", "NW",
"NW", "Fs", "2.AF", "bel", "NW", "Fs", "bel", "bel", "NW", "DE",
"2.AF", "2.AF", "MA", "Fs", "2.AF", "MA", "NW", "DE", "2.AF",
"MA", "NW", "Mu/Ku", "Fs", "2.AF", "NW")), .Names = c("ID", "A", "B"
), row.names = c("3", "5", "7", "10", "26", "29", "212", "213",
"32", "35", "38", "39", "43", "44", "45", "48", "53", "56", "57",
"59", "61", "65", "67", "68", "72", "75", "76", "77", "81", "86",
"87", "88", "92", "93", "95", "98"), class = "data.frame")
В моем исходном кадре данных значения A1 -A4 (здесь они называются 1.PF - 4.PF) не в правильном порядке, это то, что я хочу, чтобы dcast делал (так же, как выше)
ID | 1.PF | 2.PF | 3.PF | 4.PF
1 | F | NW | DE | S
2 | bel | G | N | <NA>
3 | F | NW | bel | N
EDIT:
Я не решил проблему dcast (), но нашел способ ее обойти: (функция reshape () из пакета reshape)
df <- reshape(df, idvar='ID', varying = NULL, timevar = 'value A', direction='wide')