替换'?'在0

时间:2017-03-14 17:03:37

标签: r

我在R工作,有一个包含700行和10列的数据集,其中一些值为'?'作为价值。我想替换'?'值为0.

我不确定is.na()函数是否适用于此处,因为值不是NA。如果我将数据集转换为矩阵,并在搜索“?”后,用0替换它,会有帮助吗?

我试过这段代码:

datafile <- sapply(datafile, function(y){if (y=='?') 0 else y})

之后我将文件保存为文本文件,但?没有消失。

2 个答案:

答案 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值,则此版本也有效