여러 패턴 일치 후 데이터 테이블 열의 여러 값 바꾸기
다음은 저와 같은 몇몇 'R 초보자'에게 도움이 될 수있는 스 니펫입니다. 저는 녹은 데이터 테이블 에 대한 필요성을 위해이 스레드를 언급했습니다 .
dplyr과의 부분 일치를 기반으로 데이터 프레임의 모든 위치에서 전체 문자열 교체
데이터 테이블의 열 중 하나에서 전체 문자열을 부분 일치 문자열로 바꾸는 쉬운 방법을 찾고있었습니다. 나는 포럼에서 똑바로 맞는 것을 찾을 수 없으므로이 게시물.
dt<-data.table(x=c("A_1", "BB_2", "CC_3"),y=c("K_1", "LL_2", "MM_3"),z=c("P_1","QQ_2","RR_3")
> dt
x y z
1: A_1 K_1 P_1
2: BB_2 LL_2 QQ_2
3: CC_3 MM_3 RR_3
col의 여러 값 y
을 일치시킬 여러 패턴으로 바꿉니다.
dt[,2]<-str_replace_all(as.matrix(dt[,2]),c("K_.*" = "FORMULA","LL_.*" = "RACE","MM_.*" = "CAR"))
as.matrix()
on 열을 사용 하면 str_replace_all()
함수 입력에 대한 경고가 제외됩니다 . 결과는 다음과 같습니다.
> dt[,2]<-str_replace_all(as.matrix(dt[,2]),c("K_.*" = "FORMULA","LL_.*" = "RACE","MM_.*" = "CAR"))
> dt
x y z
1: A_1 FORMULA P_1
2: BB_2 RACE QQ_2
3: CC_3 CAR RR_3
>
매우 우아하지 않지만 나를 위해 일했습니다. 열 데이터가 클 때 이것은 빠른 해결책 인 것 같습니다.
필요합니다 library(stringr)
. 개선을위한 모든 제안을 부탁드립니다.
다음과 같이 시도한 대로이 게시물을 편집하십시오.
dt<-data.table(x=c("A_1", "BB_2", "CC_3"),y=c("K_1", "LL_2", "MM_3"),z=c("P_1","QQ_2","RR_3"))
dt[, nu_col := c(1:3)]
molten.dt<-melt(dt,id.vars = "nu_col", measure.vars = c("x","y","z"))
molten.dt[, one_more := ifelse(grepl("A_.*", value), "HONDA","FERRARI")]
Rstudio의 콘솔에 표시되는 오류는 다음과 같습니다.
Error in `:=`(one_more, ifelse(grepl("A_.*", value), "HONDA", "FERRARI")) :
Check that is.data.table(DT) == TRUE. Otherwise, := and `:=`(...) are defined for use in j, once only and in particular ways. See help(":=").
R 터미널에서 완벽하게 작동합니다.
> dt<-data.table(x=c("A_1", "BB_2", "CC_3"),y=c("K_1", "LL_2", "MM_3"),z=c("P_$
> dt[, nu_col := c(1:3)]
> molten.dt<-melt(dt,id.vars = "nu_col", measure.vars = c("x","y","z"))
> molten.dt
nu_col variable value
1: 1 x A_1
2: 2 x BB_2
3: 3 x CC_3
4: 1 y K_1
5: 2 y LL_2
6: 3 y MM_3
7: 1 z P_1
8: 2 z QQ_2
9: 3 z RR_3
> molten.dt[, one_more := ifelse(grepl("A_.*", value), "HONDA","FERRARI")]
> molten.dt
nu_col variable value one_more
1: 1 x A_1 HONDA
2: 2 x BB_2 FERRARI
3: 3 x CC_3 FERRARI
4: 1 y K_1 FERRARI
5: 2 y LL_2 FERRARI
6: 3 y MM_3 FERRARI
7: 1 z P_1 FERRARI
8: 2 z QQ_2 FERRARI
9: 3 z RR_3 FERRARI
>
답변
data.table 에는 업데이트를위한 다른 API가 있습니다. 이것은 dplyr 일 것 입니다 .
tib <- tib %>% mutate(new_col = old_col + 2)
:=
연산자를 사용하여 동일한 작업이 수행됩니다 .
dt[, new_col := old_col + 2]
따라서 괄호 안에 있으면 벡터를 다른 함수에 전달할 수 있습니다. 그것을 당신의 예에 적용하기 위해 우리는 할 수 있습니다 ...
library(data.table)
library(stringr)
dt<-data.table(x=c("A_1", "BB_2", "CC_3"),y=c("K_1", "LL_2", "MM_3"),z=c("P_1","QQ_2","RR_3"))
dt[, y := str_replace_all(y,c("K_.*" = "FORMULA","LL_.*" = "RACE","MM_.*" = "CAR")) ]
dt
## x y z
## <char> <char> <char>
## 1: A_1 FORMULA P_1
## 2: BB_2 RACE QQ_2
## 3: CC_3 CAR RR_3
이후 주, str_replace_all
벡터를 기대하고, 당신은 대체 수도 as.matrix(dt[,2])
로 dt[[2]]
. 차이점은 dt[, 2]
단일 열 data.table 을 생성한다는 것입니다. as.matrix(dt[, 2])
단일 열 행렬을 dt[[2]]
생성하는 반면 벡터를 생성합니다. 나는 여전히 dt[, new := old + 2]
구문 유형을 사용하는 것이 좋습니다 .