내가 당신의 데이터 세트가 얼마나 큰 모른다 , 아마 당신은 더 긴 접근법을 취할 수 있고, 다음 :
옵션 1 : arr.ind
을 사용하십시오.
library(data.table)
myFun1 <- function(indf) {
M <- as.matrix(data.table(which(indf == 1, arr.ind = TRUE))[
, list(col = seq.int(min(col), max(col))), row])
indf[M] <- 1
indf
}
myFun1(df)
옵션 2 : max.col
을 사용하십시오.
myFun2 <- function(indf) {
indf2 <- replace(indf, is.na(indf), 0)
mins <- max.col(indf2, "first")
maxs <- max.col(indf2, "last")
L <- Map(seq.int, mins, maxs)
mat <- cbind(rep(seq_along(L), lengths(L)), unlist(L, use.names = FALSE))
indf[mat] <- 1
indf
}
myFun2(df)
다양한 크기의 데이터로 테스트 해보십시오. 여기에 데이터를 만들기 위해 하나의 접근 방식 :
set.seed(1)
nc <- 50
nr <- 10000
df <- data.frame(t(replicate(nr, sample(c(1, 1, rep(NA, nc-2))))))
일부 샘플 출력 및 타이밍 비교를 this Gist를 참조하십시오.
이렇게하는 방법은 여러 가지가 있습니다. 너 뭐 해봤 니? –
각 행에는 값이 1 인 열이 2 개만 있습니까? 1을 더 가질 가능성이 있습니까? 1s가 적습니까? 이 경우 어떤 행동을 원하십니까? – A5C1D2H2I1M1N2O1R2T1
가장 단순한 경우를 생각해 봅시다. 각 행에는 2 개의 값 1이 있습니다. 그들은 인접한 곳 (손길이 닿지 않은 채로있을 수 있음)과 값이없는 곳 사이에있을 수 있습니다. 감사! – kquach