用NA替换仅包含空格的字符串

时间:2019-05-24 13:18:47

标签: r na

我有一个数据框,其中包含名为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]==NAdf$Q2[2]==NA

我已经尝试使用grepl(" ", df),但这使我可以替换所有包含空格的条目,而不仅仅是那些包含纯空格的条目。

5 个答案:

答案 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