데이터 프레임에서 발생하는 문자열 모두 바꾸기
저는 '<'로 코딩된 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
'source' 카테고리의 다른 글
다른 버전의 mariadb에 대한 다른 검색 키 (0) | 2023.10.27 |
---|---|
호출기능의 파일명, 회선번호, 함수명 출력 - C Prog (0) | 2023.10.27 |
입력 버튼에서 외곽선 테두리를 제거하는 방법 (0) | 2023.10.27 |
우커머스 3 온라인 결제 거래 없는 주문에 대한 구글 분석 (0) | 2023.10.27 |
파이썬에서 한 줄 한 줄로 사전을 인쇄하는 방법은? (0) | 2023.10.27 |