15

行が個別で、列が名前または NA である 114 行 x 16 列のデータ フレームがあります。たとえば、最初の 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 のすべての一意の名前のリスト (行ごとに複数の一意の名前がある場合) またはベクトル (行ごとに一意の名前が 1 つだけの場合) を生成したいと考えています。

試しapply(x,1,unique)てみると、最初の行のセルが NA の場合もあれば、2 番目の行のセルが NA の場合もある 2xNcol 配列が得られます。

    [,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 などは機能しないようです。本当にシンプルなものが欠けているような気がします...

ありがとう!

4

2 に答える 2

33

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"
于 2010-02-15T21:51:59.887 に答える
18

あなたは最初の解決策に非常に近かった。しかし Aniko が指摘したように、NAunique を使用する前に値を削除する必要があります。

最初に同様のものを作成してから、あなたが行ったようdata.frameに使用する例ですが、 andapply()を結合するために使用される追加の匿名関数を使用します。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" 
于 2010-02-15T22:09:16.153 に答える