여러 패턴 일치 후 데이터 테이블 열의 여러 값 바꾸기

Nov 22 2020

다음은 저와 같은 몇몇 '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
>

답변

1 Cole Nov 23 2020 at 01:06

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]구문 유형을 사용하는 것이 좋습니다 .