요인 열만있는 주어진 데이터 프레임에 대해 최대 m
개의 속성에 대한 모든 조합을 나열하려면 데이터에이 표시되지 않습니다. 다음은 간단한 예입니다 :데이터 프레임에서 관측치가없는 모든 요소 (상호 작용)의 조합을 지정된 차원까지 중복 제거합니다.
d <- expand.grid(w=factor(1:2), x=factor(1:2), y=factor(1:2),
z=factor(1:2))
# These combinations are removed by tail():
rmcomb <- 5; head(d, rmcomb)
## w x y z
## 1 1 1 1 1
## 2 2 1 1 1
## 3 1 2 1 1
## 4 2 2 1 1
## 5 1 1 2 1
d <- tail(d, -rmcomb)
ftable(d, row.vars=c("w", "x"))
## y 1 2
## z 1 2 1 2
## w x
## 1 1 0 1 0 1
## 2 0 1 1 1
## 2 1 0 1 1 1
## 2 0 1 1 1
m == 3
을 위해, 우리는 d
에서 3 속성 4 + 6 + 4 = 14 개 조합을 고려
m <- 3
library(plyr)
llply(
1:m,
function(i) combn(ncol(d), i, simplify=F)
) -> cc
unlist(cc, recursive=F) -> cc
length(cc)
## [1] 14
우리는 현재의 선택된 열을 집계 할 수 있습니다 table
및 use which
를 사용하여 데이터를 제로로 항목을 찾을 수 있습니다 :
llply(
cc,
function(cols) {
which(table(d[, cols]) == 0, arr.ind=T) -> z
colnames(z) <- names(d)[cols]
if (nrow(z) > 0) list(z) else NULL
}
) -> zz
unlist(zz, recursive=F)
## [[1]]
## y z
## 1 1 1
##
## [[2]]
## w x z
## 1 1 1 1
##
## [[3]]
## w y z
## 1 1 1 1
## 2 2 1 1
##
## [[4]]
## x y z
## 1 1 1 1
## 2 2 1 1
항목을 위의 결과에서및 [[4]]
은 [[1]]
(= y == 1
, 관측치 없음, z == 1
) 항목에서 다루기 때문에 중복됩니다. 솔루션은 따라서 (y,z) == (1,1); (w,x,z) == (1,1,1)
이어야합니다.
적은 수의 코딩으로 문제를 해결할 수있는 중복 기능 (= 덮음) 튜플을 제거하는 등의 기능이 내장되어 있습니까? 그렇지 않다면 위의 코드에서 중복 된 항목을 어떻게 제거 하시겠습니까?
... Ferdinand.kraft @ –
: 귀하의 의견 주셔서 감사합니다. 당신에게 불명확 한 점은, 어떻게 질문을 개선 할 수 있습니까? – krlmlr