source

데이터 프레임에서 발생하는 문자열 모두 바꾸기

manysource 2023. 10. 27. 22:01

데이터 프레임에서 발생하는 문자열 모두 바꾸기

저는 '<'로 코딩된 non-detect가 있는 데이터 프레임을 작업하고 있습니다.때로는 '<' 뒤에 공백이 있을 때도 있고, 때로는 유의하지 않을 때도 있습니다.'<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

모든 경우만 교체하려는 경우"< "(여유를 두고)"<"(공백 없음), 그러면 당신이 할 수 있습니다.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

"찾고 바꾸기"에 해당합니다.너무 많이 생각하지 마세요.

하나로 시도해 보십시오.

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작업 흐름의 일부입니다.

repex 패키지(v0.2.0)에서 2018-03-11에 생성되었습니다.

모든 열의 모든 공백을 제거하려면

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

또는 이를 두 번째와 세 번째 열(즉, 첫 번째 열을 제외한 모든 열)로만 제한하려면,

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

여기 어플리퍼 솔루션이 있습니다.

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

@Nettle의 답변 업데이트로,mutate_all()에 의해 대체되었습니다.

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

문제가 있어서 "Not Available(사용 불가)"을 대체해야 했습니다.NA제 해결책은 이렇습니다.

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

파티에 늦었습니다. 하지만 리드/트레일링 화이트 스페이스만 제거하고 싶다면, R베이스에 함수가 있습니다.trimws

예를 들어,

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

언급URL : https://stackoverflow.com/questions/29271549/replace-all-occurrences-of-a-string-in-a-data-frame