在R中使用格式时如何保留NA?

时间:2012-10-23 08:43:04

标签: r format

我有一个矩阵,其中有一些NA我要格式化,然后写入CSV文件,用两个破折号替换每个NA。但是,所有NA都会被format转换为字符,而write.csv则无法检测并替换它们。

在阅读format的帮助文件后,设置na.encode=FALSE似乎是合乎逻辑的事情,但这并没有解决问题。我还搜索过谷歌和本网站上的其他人有这个问题,但找不到任何问题。这似乎应该有一个简单的答案,并让我头撞墙。

我的代码的最小示例如下所示:

data = matrix(c(pi, NA, pi*100, NA), 2, 2)
data.f = format(data, digits=4, nsmall=2)
write.csv(data.f, file="data.csv", na="--")

我正在使用R 2.15.1。这样做的正确方法是什么?

编辑:任何人都可以解释为什么这甚至需要一种解决方法吗?

2 个答案:

答案 0 :(得分:2)

可能有更正统的方法来执行此操作,但也许您可以在!is.na()阶段使用format()来阻止NA值转换为字符。

这是一个最小的例子以及生成的CSV。

set.seed(1)
data <- matrix(rnorm(20), ncol=5)
data[sample(length(data), 5)] <- NA
data.f <- data
data.f[!is.na(data.f)] <- format(data.f[!is.na(data.f)], digits = 4, nsmall = 2)
write.csv(data.f, file = "data.csv", na = "--")
dput(write.csv(data.f, na = "--"))
# "","V1","V2","V3","V4","V5"
# "1","-0.62645"," 0.32951",--,--,--
# "2"," 0.18364","-0.82047",--,"-2.21470"," 0.94384"
# "3","-0.83563"," 0.48743"," 1.51178",--," 0.82122"
# "4"," 1.59528"," 0.73832"," 0.38984","-0.04493"," 0.59390"
# NULL

答案 1 :(得分:2)

这是一种可行的解决方法

data = matrix(c(pi, NA, pi*100, NA), 2, 2)
data.f = format(data, digits=4, nsmall=2)
data.f <- replace(data.f, which(data.f == "     NA"), "--")
write.csv(data.f, file="data.csv")