Заменить все вхождения строки в кадре данных

Я работаю над фреймом данных, который не имеет детекторов, которые закодированы с помощью '<'. Иногда есть пробел после '<' а иногда и нет. '< 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

Вот где я должен:

Я могу извлечь все значения и создать новые строки, но я не могу вернуть их в фрейм данных.

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

Ответы

Ответ 1

Если вы только хотите заменить все вхождения "< " (с пробелом) на "<" (без пробела), вы можете сделать lapply по кадру данных, a 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

Ответ 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 частью вашего рабочего процесса.

Создано в 2018-03-11 пакетом представлением (v0.2.0).

Ответ 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

опоздал на вечеринку. но если вы хотите избавиться только от trimws/конечных пробелов, у R base есть функция trimws

Например:

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