web-dev-qa-db-ja.com

<NA>を空白に設定

NA行のデータフレームがあります。

 df = data.frame(c("classA", NA, "classB"), t(data.frame(rep("A", 5), rep(NA, 5), rep("B", 5))))
 rownames(df) <- c(1,2,3)
 colnames(df) <- c("class", paste("Year", 1:5, sep = ""))

 > df
   class Year1 Year2 Year3 Year4 Year5
1 classA     A     A     A     A     A
2   <NA>  <NA>  <NA>  <NA>  <NA>  <NA>
3 classB     B     B     B     B     B

ClassA行とclassB行の間にスペースを確保したかったため、意図的に空の行(NA行)を導入しました。

ここで、2番目の行が空の行のように見えるように、<NA>を空白で置き換えたいと思います。

私は試した:

 df[is.na(df)] <- ""

そして

 df[df == "NA"] <- ""

しかし、うまくいきませんでした。

何か案は?ありがとう!

25
Mayou

別の選択肢:

df <- sapply(df, as.character) # since your values are `factor`
df[is.na(df)] <- 0

ゼロではなく空白が必要な場合

> df <- sapply(df, as.character)
> df[is.na(df)] <- " "
> df
     class    Year1 Year2 Year3 Year4 Year5
[1,] "classA" "A"   "A"   "A"   "A"   "A"  
[2,] " "      " "   " "   " "   " "   " "  
[3,] "classB" "B"   "B"   "B"   "B"   "B"  

Data.frameが必要な場合は、as.data.drame

> as.data.frame(df)
   class Year1 Year2 Year3 Year4 Year5
1 classA     A     A     A     A     A
2                                     
3 classB     B     B     B     B     B
33
Jilber Urbina

この回答は、拡張コメントです。

あなたがやろうとしていることは、私がグッドプラクティスと考えるものではありません。 RはExcelではないので、データ内で視覚的な分離を作成するためにこのようなことを行うと、後で頭痛の種になります。

あなたが本当に視覚的な出力だけに関心があるなら、私は2つの提案を提供できます:

  1. 視覚的な分離でデータを表示する場合は、printna.print引数を使用します。

    print(df, na.print = "")
    #    class Year1 Year2 Year3 Year4 Year5
    # 1 classA     A     A     A     A     A
    # 2                                     
    # 3 classB     B     B     B     B     B
    
  2. 上記でさえ最良の提案ではないことを理解してください。 data.framelistに変換して、visualcontentの両方の分離を取得します。

    split(df, df$class)
    # $classA
    #    class Year1 Year2 Year3 Year4 Year5
    # 1 classA     A     A     A     A     A
    # 
    # $classB
    #    class Year1 Year2 Year3 Year4 Year5
    # 3 classB     B     B     B     B     B