Ошибка передачи / Найти неправильные идентификаторы в кадре данных - PullRequest
0 голосов
/ 15 января 2012

Мой фрейм данных выглядит так:

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')      

Ответы [ 3 ]

2 голосов
/ 15 января 2012

table и which наверняка будут ответом на первый вопрос:

 names(table(dfrm$ID))[which(table(dfrm$ID) <4)]
#[1] "2"

Что касается второго вопроса, возможно, вам следует опубликовать код, который генерирует ошибку. На данный момент неясно, что вы пытаетесь (и не можете) сделать.

РЕДАКТИРОВАТЬ:

Если я преобразую факторные переменные в символьные переменные, я получу dcast для возврата правильного объекта, хотя моя ошибка отличается от вашей. Я получил ошибку в изменениях 1.1 и 1.2.1 на R 2.14.1 на Mac.

EDIT2: Как оказалось, ошибка была исправлена ​​в самой последней версии plyr. Я не получаю ошибки с изменением формы 1.2.1, работающим с plyr 1.7. Вам также следует обновить эти два пакета и перезапустить новый сеанс.

require(reshape2)
dfrm <- structure(list(ID = c(1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3), value.A = structure(c(1L, 
2L, 3L, 4L, 1L, 2L, 3L, 1L, 2L, 3L, 4L), .Label = c("   A1    ", 
"   A2    ", "   A3    ", "   A4    "), class = "factor"), value.B = structure(c(2L, 
6L, 1L, 7L, 1L, 3L, 6L, 2L, 4L, 5L, 6L), .Label = c("   B", "   F", 
"   G", "   H", "   J", "   N", "   S"), class = "factor")), .Names = c("ID", 
"value.A", "value.B"), class = "data.frame", row.names = c(NA, 
-11L))
dcast(dfrm2, ID ~ value.A)
# Using value.B as value column: use value_var to override.
# Error in names(data) <- array_names(res$labels[[2]]) : 
#  'names' attribute [4] must be the same length as the vector [1]
# I first tried removing the leading and trainly spaces with:
dfrm2 <- data.frame(lapply(dfrm, gsub, patt="^\\s+|\\s+$", rep=""))
# Still got the error. Now try to leave as "character" type.

dfrm2 <- data.frame(lapply(dfrm, gsub, patt="^\\s+|\\s+$", rep=""),stringsAsFactors=FALSE)
str(dfrm2)
#-----------------
'data.frame':   11 obs. of  3 variables:
 $ ID     : chr  "1" "1" "1" "1" ...
 $ value.A: chr  "A1" "A2" "A3" "A4" ...
 $ value.B: chr  "F" "N" "B" "S" ...

dcast(dfrm2, ID ~ value.A)
#------------------
Using value.B as value column: use value_var to override.
  ID A1 A2 A3   A4
1  1  F  N  B    S
2  2  B  G  N <NA>
3  3  F  H  J    N
2 голосов
/ 15 января 2012

Вы должны упомянуть, что dcast из пакета reshape2 (не является частью базы R). Я не уверен, что вы пытаетесь сделать с этим, но это должно делать то, что вы просите.

Составьте данные:

id <- rep(1:3,c(4,3,4))
d <- data.frame(id)
d <- ddply(d,.(id),
           function(x) {
             transform(x,A=paste("A",seq(nrow(x)),sep=""),
                       B=sample(LETTERS,nrow(x),replace=TRUE))
           })

Определите «плохие» группы:

idtab <- table(d$id)
d2 <- d[!id %in% names(idtab)[idtab<4],]

Хотя я могу это сделать, если я пытаюсь использовать полный набор данных, dcast делает «правильную» вещь (то есть то, на что я бы надеялся и как это звучало, как вы хотели), и заполняет недостающие значения с NA; Я не получил ошибку (я использую reshape2 v 0.8.4 в разрабатываемой версии R).

library(reshape2)

С очищенными данными:

dcast(d2,id~A)
# Using B as value column: use value.var to override.
#   id A1 A2 A3 A4
# 1  1  B  X  P  E
# 2  3  F  Q  H  B

С исходными данными:

dcast(d,id~A)
# Using B as value column: use value.var to override.
#   id A1 A2 A3   A4
# 1  1  B  X  P    E
# 2  2  I  N  H <NA>
# 3  3  F  Q  H    B
1 голос
/ 16 января 2012

Попробуйте tapply. (Если третий столбец уже равен character, а не factor, то as.character можно опустить):

tapply(as.character(DF[,3]), DF[-3], c)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...