【问题标题】:How to replace cells with only a space (" ") in R如何在R中仅用空格(“”)替换单元格
【发布时间】:2016-11-03 11:48:51
【问题描述】:

我试图在 R 中仅用空格 (" ") 替换单元格,但由于某种原因它无法正常工作。我的向量是这样的:

[1] "SICREDI N/NE"            "SICOOB CREDIMINAS"       "UNICRED SC/PR"          
[4] " "                       " "                       "CRESOL  SC/RS"          

我尝试使用CENTRAL<-gsub("\\\b \\\b", NA,CENTRAL) 但后来它返回了:

[1] NA              NA              NA              NA              NA             
[6] "CRESOL  SC/RS" NA              NA              NA              NA 

【问题讨论】:

  • 任何有空格的元素都被替换为 NA。您可能想要正则表达式:"^\\b \\b$".
  • 如果您的 " " 存在于您读取到 R 的文件中,请检查 read.table 中的 na.strings 参数。 Several similar Q&As on SO

标签: r replace gsub


【解决方案1】:

您的单词中有空格,因此 gsub 正在插入一个 NA ,这会在整个条目中产生一个 NA 值。你可以这样做:

vec <- c("words with spaces", "word with spaces", " ", " ", "not", "here")
vec

[1] "words with spaces"
[2] "word with spaces" 
[3] " "                
[4] " "                
[5] "not"              
[6] "here"    


vec[vec==" "]
[1] " " " "

vec[vec==" "] <- NA
vec
[1] "words with spaces"
[2] "word with spaces" 
[3] NA                 
[4] NA                 
[5] "not"              
[6] "here"

【讨论】:

  • 成功了!非常感谢
  • @T.Veiga 你能用 dput 发布你的数据或更大的样本吗?
【解决方案2】:

一种更快的方法可能是(加布里埃尔打败了我):

x <- c("SICREDI N/NE", "SICOOB CREDIMINAS", "UNICRED SC/PR",
       " ", " ", "CRESOL SC/RS")
x[x == " "] <- NA

您对正则表达式所做的工作有效,但速度要慢很多(以毫秒为单位,超过 40,000 个元素)

x <- rep(c("SICREDI N/NE", "SICOOB CREDIMINAS", "UNICRED SC/PR",
       " ", " ", "CRESOL SC/RS"), 10000)

y <- rep(c("SICREDI N/NE", "SICOOB CREDIMINAS", "UNICRED SC/PR",
       " ", " ", "CRESOL SC/RS"), 10000)

z <- rep(c("SICREDI N/NE", "SICOOB CREDIMINAS", "UNICRED SC/PR",
           " ", " ", "CRESOL SC/RS"), 10000)

library(microbenchmark)
microbenchmark(
  first = {x[x == " "] <- NA},
  second = {y[grepl("^\\b \\b$", y)] <- NA},
  sub = gsub("^\\b \\b$", NA, z)
)

Unit: milliseconds
   expr       min        lq      mean    median        uq       max neval cld
  first  1.223415  1.231626  1.367973  1.235438  1.247461  2.896081   100 a  
 second  5.633810  5.681902  5.929447  5.697737  5.742457  8.063632   100  b 
    sub 16.960371 17.223557 17.345403 17.271795 17.308452 18.919242   100   c

我认为x[x == " "] &lt;- NA 比任何一种正则表达式方法都更容易阅读。

如果你想稍微提高速度,你可以使用x[x %in% " "] &lt;- NA,它比==效率更高,但只是勉强。

(现在我正式花了太多时间探索这个:))

【讨论】:

  • 很有趣,感谢您展示这一点。我没有意识到正则表达式有多慢,我真的不知道%in% 更快——我想知道为什么。
  • 不错。感谢分享。
  • “更快”在这里是一个非常不具体的术语。它比 40,000 的向量快了大约 200 毫秒。只有当 a) 我需要替换多个值,或者 b) 我真的想要简化(也许如果我要将它应用于数十亿条记录)时,我才会实现这种差异.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2020-05-16
  • 1970-01-01
  • 2021-10-29
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多