Обработка значений NA в применении и уникальных
У меня есть 114 строк по 16 кадровым кадром, где строки являются отдельными, а столбцы - либо их именами, либо NA. Например, первые 3 строки выглядят так:
name name.1 name.2 name.3 name.4 name.5 name.6 name.7 name.8 name.9 name.10 name.11 name.12 name.13 name.14 name.15
1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> Aanestad <NA> Aanestad <NA> Aanestad <NA>
2 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> Ackerman <NA> Ackerman <NA> Ackerman <NA> Ackerman <NA>
3 <NA> <NA> <NA> <NA> <NA> <NA> Alarcon <NA> Alarcon <NA> Alarcon <NA> Alarcon <NA> <NA> <NA>
Я хочу создать список (если несколько уникальных имен для каждой строки) или вектор (если только одно уникальное имя для каждой строки) всех уникальных имен с длиной 114.
Когда я пытаюсь apply(x,1,unique)
, я получаю массив 2xNcol, где иногда ячейка первой строки является NA, а иногда вторая ячейка строки NA.
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] NA NA NA NA "Alquist" NA "Ayala" NA NA
[2,] "Aanestad" "Ackerman" "Alarcon" "Alpert" NA "Ashburn" NA "Baca" "Battin"
Когда я хочу просто:
Aanestad
Ackerman
Alarcon
...
Я не могу понять, как применять unique() при игнорировании NA. na.rm, na.omit и т.д., похоже, не работают. Я чувствую, что мне не хватает чего-то реального простого...
Спасибо!
Ответы
Ответ 1
unique
не имеет аргумента na.rm
, но вы можете удалить пропущенные значения самостоятельно, прежде чем вызывать его:
A <- matrix(c(NA,"A","A",
"B", NA, NA,
NA, NA, "C"), nr=3, byrow=TRUE)
apply(A, 1, function(x)unique(x[!is.na(x)]))
дает
[1] "A" "B" "C"
Ответ 2
Вы были очень, очень близки в своем первоначальном решении. Но, как заметил Анико, вы должны удалить значения NA
прежде чем сможете использовать уникальные.
Пример, в котором мы сначала создаем аналогичный data.frame
а затем используем apply()
как вы это сделали, но с дополнительной анонимной функцией, которая используется для объединения na.omit()
и unique()
:
R> DF <- t(data.frame(foo=sample(c(NA, "Foo"), 5, TRUE),
bar=sample(c(NA, "Bar"), 5, TRUE)))
R> DF
[,1] [,2] [,3] [,4] [,5]
foo "Foo" NA "Foo" "Foo" "Foo"
bar NA NA NA "Bar" "Bar"
R> apply(DF, 1, function(x) unique(na.omit(x)))
foo bar
"Foo" "Bar"