处理apply和唯一的NA值

时间:2010-02-15 21:32:28

标签: r unique apply

我有一个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
...

我似乎无法弄清楚如何在忽略NA时应用unique()。 na.rm,na.omit等似乎不起作用。我觉得我错过了一些非常简单的事情......

谢谢!

2 个答案:

答案 0 :(得分:25)

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"

答案 1 :(得分:12)

您在初始解决方案中非常非常接近。但正如Aniko所说,在使用unique之前,你不要删除NA值。

我们首先创建一个类似的data.frame,然后像你一样使用apply()的例子 - 但是有一个额外的匿名函数,用于组合na.omit()和{{1} }:

unique()