我有一个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行),因为我想在classA行和classB行之间留一些空格。
现在,我想将<NA>
替换为空白,以便第二行看起来像一个空行。
我试过了:
df[is.na(df)] <- ""
和
df[df == "NA"] <- ""
但它不起作用..
有什么想法吗?谢谢!
答案 0 :(得分:31)
另一种选择:
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
答案 1 :(得分:8)
这个答案更像是一个扩展的评论。
你要做的不是我认为的良好做法。 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