我有一个数据框,其中包含名为Q1至Q98的列。这些列包含字符串("This is a string"
),但是某些条目仅包含不同数量的空格(" "
," "
)。我想用NA
替换所有仅包含空格的条目。
考虑以下代码创建的数据框:
df<-data.frame(Q1=c("Test test","Test"," "," "),Q2=c("Sample sample"," ","Sample","Sample"))
该解决方案将修改上面的数据帧df
,以使df$Q1[3:4]==NA
和df$Q2[2]==NA
。
我已经尝试使用grepl(" ", df)
,但这使我可以替换所有包含空格的条目,而不仅仅是那些包含纯空格的条目。>
答案 0 :(得分:5)
一种dplyr
可能是:
df %>%
mutate_all(~ ifelse(nchar(trimws(.)) == 0, NA_character_, .))
Q1 Q2
1 Test test Sample sample
2 Test <NA>
3 <NA> Sample
4 <NA> Sample
或与base R
相同:
df[] <- lapply(df, function(x) ifelse(nchar(trimws(x)) == 0, NA_character_, x))
或者:
df %>%
mutate_all(~ trimws(.)) %>%
na_if(., "")
答案 1 :(得分:0)
您可以搜索以开头^
,然后是一个或多个空格+
,然后是结尾$
的字符串。
df[sapply(df, function(x) grepl('^ +$', x))] <- NA
# Q1 Q2
# 1 Test test Sample sample
# 2 Test <NA>
# 3 <NA> Sample
# 4 <NA> Sample
其他一些可能性
df[] <- lapply(df, function(x) replace(x, grep('^ +$', x), NA))
#or
replace(df, sapply(df, function(x) grepl('^ +$', x)), NA)
答案 2 :(得分:0)
一个dplyr
+ stringr
选项
library(dplyr)
library(stringr)
df %>% mutate_all(~str_replace(., "^\\s+$", NA_character_))
# Q1 Q2
#1 Test test Sample sample
#2 Test <NA>
#3 <NA> Sample
#4 <NA> Sample
答案 3 :(得分:0)
将sub应用于空白的所有列:
lapply(df, FUN = sub, pattern = "^\\s*$", replacement = NA)
答案 4 :(得分:0)
我们可以在base R
df[trimws(as.matrix(df)) == ''] <- NA
df
# Q1 Q2
#1 Test test Sample sample
#2 Test <NA>
#3 <NA> Sample
#4 <NA> Sample
或与replace
library(dplyr)
df %>%
mutate_all(list(~ replace(., trimws(.)=="", NA)))
# Q1 Q2
#1 Test test Sample sample
#2 Test <NA>
#3 <NA> Sample
#4 <NA> Sample