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

在R中使用格式时如何保留NAs?,r,format,R,Format,我有一个矩阵,其中有一些NA,我想格式化,然后写入CSV文件,用两个破折号替换每个NA。但是,所有的NA都通过格式转换为字符,write.csv则无法检测并替换它们 在阅读了格式的帮助文件后,设置na.encode=FALSE似乎是合乎逻辑的,但这并没有解决问题。我也用谷歌搜索过,也在这个网站上搜索过其他有这个问题的人,但是没有找到。这似乎应该有一个简单的答案,让我头痛不已 我的代码的一个简单示例如下所示: data = matrix(c(pi, NA, pi*100, NA), 2, 2) d

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

在阅读了
格式的帮助文件后,设置
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="--")
我用的是R2.15.1。正确的方法是什么


编辑:有人能解释一下为什么这甚至需要一个变通方法吗?

可能有一种更传统的方法可以做到这一点,但也许你可以使用
!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
set.seed(1)

数据可能有一种更正统的方法来实现这一点,但也许您可以使用
!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
set.seed(1)

数据这里有一个可能的解决方法

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")
data=矩阵(c(pi,NA,pi*100,NA),2,2)
data.f=格式(数据,数字=4,nsmall=2)

data.f这里有一个可能的解决方法

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")
data=矩阵(c(pi,NA,pi*100,NA),2,2)
data.f=格式(数据,数字=4,nsmall=2)

是的,我确实考虑过这样的事情,但我觉得奇怪的是,这么简单的事情需要一个解决办法。是的,我同意。另一方面,当您考虑<代码>格式>代码>时,<代码>数据.f>代码>对象只是适合打印的文本——因此,关于<代码> n>代码>的信息丢失,并简单地编码为文本。但我觉得奇怪的是,这么简单的事情需要解决。是的,我有点同意。另一方面,当您思考
格式
正在做什么时,
data.f
对象只是文本,很适合打印-因此有关
NA
的信息丢失,只需编码为文本。谢谢。我将在一两天内不回答这个问题,看看是否有人能解释为什么这甚至需要一个解决方案,但如果之后没有帖子,我会继续接受这个答案。这很有效,谢谢。我将在一两天内不回答这个问题,看看是否有人能解释为什么这甚至需要一个解决方案,但如果之后没有帖子,我会继续接受这个答案。