2017-08-24 114 views
0

在下面的测试数据框中,我试图将包含“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

您正在替换此处的列... –

+0

要进一步解释Damiano的评论,如果它们包含“NA”,则替换带有“”的列。由于每列都包含“NA”,因此您当然留下了一个空白数据框。注意,如果你用'dat $ V1 < - c(“NA”,“NA”)和'dat $ V2 < - c(“foo”,“bar”)构造一个数据帧, – aku

回答

1

只需使用GSUB

value <- "NA" 

for (i in 1:ncol(dat)) { 
    dat[,i] <- gsub(value, "", dat[,i]) 
} 
dat 
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 
1
dat <- lapply(dat, function(x) {gsub("NA", "", x)}) 
dat <- data.frame(dat) 
0

也许在你的情况你是一个矩阵更好。现在

datm <- as.matrix(dat) 

你提出的解决方案的工作原理:

datm[grepl(value, datm)] <- "" 

或使用GSUB:

datm = gsub("\\s*NA\\s*", "",datm) 

你可以将其转换为数据整理后,数据帧。

相关问题