在下面的测试数据框中,我试图将包含“NA”的数据帧中的每个字符串更改为“”(以便将NAs留空)。
dat <- as.data.frame(matrix(ncol=2, nrow=2))
dat$V1 <- c(" NA", "foo")
dat$V2 <- c("bar", "NA ")
dat
V1 V2
1 NA bar
2 foo NA
但是,以下命令返回一个完全空白的数据帧,就好像所有字符串都包含“NA”一样。为什么会发生这种情况?什么是正确的解决方案?
value <- "NA"
dat[grepl(value, dat)] <- ""
答案 0 :(得分:1)
dat <- lapply(dat, function(x) {gsub("NA", "", x)})
dat <- data.frame(dat)
答案 1 :(得分:1)
只需使用gsub
value <- "NA"
for (i in 1:ncol(dat)) {
dat[,i] <- gsub(value, "", dat[,i])
}
dat
答案 2 :(得分:0)
library(data.table)
setDT(dat)
for(j in seq_along(dat)){
set(dat, i = which(dat[[j]] %like% "NA"), j = j, value = "")
}
V1 V2
# 1: bar
# 2: foo
答案 3 :(得分:0)
也许在你的情况下你最好用矩阵。
datm <- as.matrix(dat)
现在您提出的解决方案有效:
datm[grepl(value, datm)] <- ""
或使用gsub:
datm = gsub("\\s*NA\\s*", "",datm)
您可以在数据清理后将其转换为数据框。