我在R工作,有一个包含700行和10列的数据集,其中一些值为'?'作为价值。我想替换'?'值为0.
我不确定is.na()
函数是否适用于此处,因为值不是NA
。如果我将数据集转换为矩阵,并在搜索“?”后,用0替换它,会有帮助吗?
我试过这段代码:
datafile <- sapply(datafile, function(y){if (y=='?') 0 else y})
之后我将文件保存为文本文件,但?
没有消失。
答案 0 :(得分:2)
您甚至不需要转换为矩阵。正如Ben Bolker所说,您最好的选择是在阅读文件时使用na.strings
。
如果数据框不是来自文件,您可以直接执行:
df[df=="?"] <- 0
您必须记住,包含字符的任何内容都可能会转换为因子。如果是这种情况,您必须将这些因素转换为字符。 Ben给你一个强力选择,这是一个更温和的方法:
# check which variables are factors
isfactor <- sapply(df, is.factor)
# convert them to character
# I use lapply bcs that returns a list, and I use the
# list-like selection of "elements" (variables) to replace
# the variables
df[isfactor] <- lapply(df[isfactor], as.character)
所以如果你把所有东西放在一起,你会得到:
df <- data.frame(
a = c(1,5,3,'?',4),
b = c(3,'?','?',3,2)
)
isfactor <- sapply(df, is.factor)
df[isfactor] <- lapply(df[isfactor], as.character)
df[df=="?"] <- 0
df
答案 1 :(得分:1)
这取决于您的数据集中是否有其他NA
值。如果没有,几乎可以肯定最简单的方法是使用na.strings=
read.(table|csv|cv2|delim)
参数,即使用dd <- read.csv(...,na.strings=c("?","NA")
之类的内容读取数据。然后
dd[is.na(dd)] <- 0
如果由于某种原因你无法控制这部分过程(例如有人递给你一个.rda
文件并且你没有原始的CSV),那么它会更乏味 - 你需要
which.qmark <- which(x=="?")
x <- suppressWarnings(as.numeric(as.character(x)))
x[which.qmark] <- 0
(如果您的数据中同时包含?
和其他NA
值,则此版本也有效