m 개의 문자열 열이있는 data.table, DT를 기반으로 문자열이있는 행에 플래그를 지정할 수 있습니다 (예 : "BlaBla"가 하나 이상의 열에 표시되는 경우)?
내가 원하는 것은 :
DT[, flag_BlaBLa:=(test if "BlaBLa" appears in any column except the first one)]
열 이름을 명시 적으로 참조하고 싶지 않습니다. 오히려 col 2를 DT의 최대 col 번호 (아마도 2:ncol(DT)
) 로 참조해야합니다 . 왜 안돼? 실제로는 각기 다른 수의 열이있는 data.frames 목록이 있습니다. 위에 표시된대로 목록의 모든 data.frame에 대해 플래그를 만들어야합니다.
Edit1 : 재현 가능한 예제 추가. Edit2 : 일부 'BlaBLa'문자열을 'BlaBLa + something'으로 변경합니다. 또한 'BlaBLa'를 포함하므로 일치하는 것으로 간주되어야합니다.
DT는 cols로 시작 a,b,c
하고 스크립트로 flag_BlaBLa
. 최종 결과는 다음과 같습니다.
DT <- data.table(a=c("x","y","z",'w'),
b=c('BlaBLa','BLe','Bli','BlaBLaSometing'),
c=c('Bla','BLe','BlaBLa','Blo'),
flag_BlaBLa=c(T,F,T,T)
)
목록의 경우 최종 결과는 다음과 같아야합니다.
DT1 <- data.table(a=c("x","y","z",'w'),
b=c('BlaBLa','BLe','Bli','BlaBLaSomething'),
c=c('Bla','BLe','BlaBLa','Blo'),
flag_BlaBLa=c(T,F,T,T)
)
DT2 <- data.table(a=c("q","j","p"),
b=c('BLe','Bli','BlaBLa'),
flag_BlaBLa=c(F,F,T)
)
l <- list(DT1,DT2)
목록을 반복하고 열을 선택하고 행에 "BlaBLa"가 하나 이상 있는지 확인하고 TRUE
/ 행을 표시 할 수 FALSE
있습니다.
library(data.table)
lapply(l, function(x) x[, flag_BlaBLa := rowSums(x[,2:ncol(x)] == "BlaBLa") > 0])
l
#[[1]]
# a b c flag_BlaBLa
#1: x BlaBLa Bla TRUE
#2: y BLe BLe FALSE
#3: z Bli BlaBLa TRUE
#4: w BlaBLa Blo TRUE
#[[2]]
# a b flag_BlaBLa
#1: q BLe FALSE
#2: j Bli FALSE
#3: p BlaBLa TRUE
편집하다
정확히 일치하지 않고 해당 문자열의 패턴을 찾아야하는 경우 열을 반복해야합니다 (@MichaelChirico와 유사). rowSums
lapply(l, function(x) x[, flag_BlaBLa := rowSums(sapply(x[, 2:ncol(x)],
grepl, pattern = 'BlaBLa', fixed = TRUE)) > 0])
#[[1]]
# a b c flag_BlaBLa
#1: x BlaBLa Bla TRUE
#2: y BLe BLe FALSE
#3: z Bli BlaBLa TRUE
#4: w BlaBLaSomething Blo TRUE
#[[2]]
# a b flag_BlaBLa
#1: q BLe FALSE
#2: j Bli FALSE
#3: p BlaBLa TRUE
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다