Подтвердить что ты не робот

Установка <NA> на пустой

У меня есть dataframe с строкой 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

Я назначил пустую строку (строку NA), потому что я хотел иметь некоторое пространство между строкой класса и строкой класса B.

Теперь я хотел бы подставить <NA> пустым, так что вторая строка выглядит как пустая строка.

Я пробовал:

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

и

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

но это не сработало.

Любые идеи? Спасибо!

4b9b3361

Ответ 1

Другая альтернатива:

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

Ответ 2

Этот ответ является скорее расширенным комментарием.

То, что вы пытаетесь сделать, - это не то, что я считаю хорошей практикой. R не является, скажем, Excel, поэтому делать что-то подобное просто для создания визуального разделения в ваших данных, это просто даст вам головную боль позже на линии.

Если вы действительно заботитесь только о визуальном выходе, я могу предложить два предложения:

  • Используйте аргумент na.print для 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
    
  • Поймите, что даже выше это не лучшее предложение. Получите как визуальное, так и контентное разделение, преобразов ваш data.frame в list:

    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