【问题标题】:Replace all occurrences of a string in a data frame替换数据框中所有出现的字符串
【发布时间】:2015-05-30 01:28:28
【问题描述】:

我正在处理一个数据帧,其中包含用“

例子:

data <- data.frame(name = rep(letters[1:3], each = 3), var1 = rep('< 2', 9), var2 = rep('<3', 9))

  name var1 var2 
1    a  < 2   <3
2    b  < 2   <3
3    c  < 2   <3

这是我要去的地方:

我可以提取所有值并创建新字符串,但我无法将它们放回数据框中。

index <- str_detect(unlist(data), '<')
index <- matrix(index, nrow = 3)

data[index] 
#[1] "< 2" "< 2" "< 2" "<3"  "<3"  "<3" 

replacements <- str_replace_all(data[index], "<[ ]+","<") 
replacements
#[1] "<2" "<2" "<2" "<3" "<3" "<3"

data[index] <- replacements

#Error in `[<-.data.frame`(`*tmp*`, index, value = c("<2", "<2", "<2",  : 
#  unsupported matrix index in replacement

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    如果您希望将所有出现的"&lt; "(带空格)替换为"&lt;"(无空格),那么您可以在数据框上执行lapply,使用gsub 用于替换:

    > data <- data.frame(lapply(data, function(x) {
    +                  gsub("< ", "<", x)
    +              }))
    > data
      name var1 var2
    1    a   <2   <3
    2    a   <2   <3
    3    a   <2   <3
    4    b   <2   <3
    5    b   <2   <3
    6    b   <2   <3
    7    c   <2   <3
    8    c   <2   <3
    9    c   <2   <3
    

    【讨论】:

    • 改用lapply - 它将强制保存到矩阵中。
    • data.frame(lapply(data, function(x) {gsub("&lt;\\s*", "&lt;", x)}))
    • 这会将对象转换为列表,因此之后您需要data &lt;- as.data.frame(data)。或者当然是上面评论中的解决方案,来自 Avinash Raj。最后一件事:现在是 2017 年,所以我们现在写 data &lt;- data %&gt;% as.data.frame()
    • data.frame(lapply(data, function(x) gsub("&lt; ", "&lt;", x), stringsAsFactors=F) 将避免将字符转换为因子,以防万一......
    • 这个方法唯一的问题是它把所有类型的列都改成字符格式
    【解决方案2】:

    相当于“查找和替换”。不要想太多。

    试一试:

    library(tidyverse)
    df <- data.frame(name = rep(letters[1:3], each = 3), var1 = rep('< 2', 9), var2 = rep('<3', 9))
    
    df %>% 
      mutate(var1 = str_replace(var1, " ", ""))
    #>   name var1 var2
    #> 1    a   <2   <3
    #> 2    a   <2   <3
    #> 3    a   <2   <3
    #> 4    b   <2   <3
    #> 5    b   <2   <3
    #> 6    b   <2   <3
    #> 7    c   <2   <3
    #> 8    c   <2   <3
    #> 9    c   <2   <3
    

    适用于所有

    df %>% 
      mutate_all(funs(str_replace(., " ", "")))
    #>   name var1 var2
    #> 1    a   <2   <3
    #> 2    a   <2   <3
    #> 3    a   <2   <3
    #> 4    b   <2   <3
    #> 5    b   <2   <3
    #> 6    b   <2   <3
    #> 7    c   <2   <3
    #> 8    c   <2   <3
    #> 9    c   <2   <3
    

    如果额外的空间是通过合并列产生的,请考虑将str_trim 纳入您的工作流程。

    reprex package (v0.2.0) 于 2018 年 3 月 11 日创建。

    【讨论】:

    • 非常好,我会改用str_replace_all:df %&gt;% mutate_all(funs(str_replace_all(., " ", "")))
    • 仅作记录:我试过df %&gt;% mutate_all(str_replace_all, " ", "") 似乎有效。简短易读。注意:将因素强制转换为字符!
    • 一个注释 - 我们现在写 data &lt;- data %&gt;% as.data.frame()
    【解决方案3】:

    要删除每列中的所有空格,您可以使用

    data[] <- lapply(data, gsub, pattern = " ", replacement = "", fixed = TRUE)
    

    或将其限制为仅第二列和第三列(即除第一列之外的每一列),

    data[-1] <- lapply(data[-1], gsub, pattern = " ", replacement = "", fixed = TRUE)
    

    【讨论】:

      【解决方案4】:

      这是一个 dplyr 解决方案

      library(dplyr)
      library(stringr)
      
      Censor_consistently <-  function(x){
        str_replace(x, '^\\s*([<>])\\s*(\\d+)', '\\1\\2')
      }
      
      
      test_df <- tibble(x = c('0.001', '<0.002', ' < 0.003', ' >  100'),  y = 4:1)
      
      mutate_all(test_df, funs(Censor_consistently))
      
      # A tibble: 4 × 2
      x     y
      <chr> <chr>
      1  0.001     4
      2 <0.002     3
      3 <0.003     2
      4   >100     1
      

      【讨论】:

        【解决方案5】:

        我遇到了问题,我不得不用NA 替换“不可用”,我的解决方案是这样的

        data <- sapply(data,function(x) {x <- gsub("Not Available",NA,x)})
        

        【讨论】:

          【解决方案6】:

          聚会迟到了。但如果你只想摆脱前导/尾随空格,R base 有一个函数trimws

          例如:

          data <- apply(X = data, MARGIN = 2, FUN = trimws) %>% as.data.frame()
          

          【讨论】:

            猜你喜欢
            • 2022-12-03
            • 2014-10-31
            • 2012-08-01
            • 2016-04-01
            • 2014-08-05
            • 2021-12-27
            • 2019-01-10
            • 2018-07-11
            • 1970-01-01
            相关资源
            最近更新 更多