替换数据框中出现的所有字符串

Ton*_*son 48 r dataframe

我正在研究一个非检测数据框,用'<'编码.有时在'<'之后有一个空格,有时不是例如'<2'或'<2'.我想删除每一个空间.

例:

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
Run Code Online (Sandbox Code Playgroud)

这是我必须要做的:

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

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
Run Code Online (Sandbox Code Playgroud)

Tim*_*sen 35

如果您只想"< ""<"(没有空格)替换所有出现的(带空格),那么您可以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
Run Code Online (Sandbox Code Playgroud)

  • `data.frame(lapply(data,function(x){gsub("<\\ s*","<",x)})) (13认同)
  • 使用`lapply`代替 - 它会将强制保存到矩阵. (4认同)

Net*_*tle 30

相当于"查找和替换".不要过度思考它.

试一试:

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
Run Code Online (Sandbox Code Playgroud)

全部应用

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
Run Code Online (Sandbox Code Playgroud)

如果通过联合列生成额外空间,请考虑制作str_trim工作流程的一部分.

reprex包(v0.2.0)于2018-03-11创建.

  • 非常好,我会使用str_replace_all:`df%>%mutate_all(funs(str_replace_all(.,"",""))) (5认同)
  • 仅作记录:我尝试了`df%&gt;%mutate_all(str_replace_all,“”,“”)`似乎可以工作。简短易读。注意:强制性格因素! (2认同)

Ric*_*ven 15

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

data[] <- lapply(data, gsub, pattern = " ", replacement = "", fixed = TRUE)
Run Code Online (Sandbox Code Playgroud)

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

data[-1] <- lapply(data[-1], gsub, pattern = " ", replacement = "", fixed = TRUE)
Run Code Online (Sandbox Code Playgroud)


Ton*_*son 11

这是一个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
Run Code Online (Sandbox Code Playgroud)


小智 10

作为对 @Nettle 答案的更新,mutate_all()已被以下取代mutate( across( ... ) )

library(tidyverse)

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

df %>%
    mutate( across(
        .cols = everything(),
        ~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
Run Code Online (Sandbox Code Playgroud)


Ank*_*yar 5

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

data <- sapply(data,function(x) {x <- gsub("Not Available",NA,x)})
Run Code Online (Sandbox Code Playgroud)