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

时间:2015-03-26 05:15:39

标签: r dataframe

我正在处理一个没有检测到的数据框,这些数据框用'<&#;;进行编码。有时在'<'之后会有一个空格。有时不是例如'&2'或'< 2&#39 ;.我想删除每一个空间。

示例:

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

6 个答案:

答案 0 :(得分:30)

如果您希望将所有"< "(带空格)替换为"<"(无空格),那么您可以执行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

答案 1 :(得分:21)

相当于&#34;查找和替换。&#34;不要过分思考它。

尝试一下:

if( is_array( $tag_data ) && in_array($v['id'], $tag_data) )

适用于所有

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 作为工作流程的一部分。

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

答案 2 :(得分:11)

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

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

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

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

答案 3 :(得分: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

答案 4 :(得分:3)

我遇到了问题,我不得不更换&#34; Not Available&#34;使用NA,我的解决方案就像这样

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

答案 5 :(得分:0)

参加聚会。但是,如果您只想摆脱前导/后缀空白,则R base具有函数trimws

例如:

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