2017-08-24 155 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) 

你可以將其轉換爲數據整理後,數據幀。

相關問題