문제
다음과 같은 데이터 구조가 있습니다.
groupA1 groupA2 groupB1 groupB2 date text
0 1 1 1 2013-01-01 the dog
각각 groupB
변수에서 값이 1인 각 열에 대해 하나의 행을 나열하고 싶습니다.다음의 모든 조합을 나열해야 합니다. groupA
그리고 groupB
여기서 1은 하나의 행에 표시되지만 각 조합에 날짜와 텍스트를 해당 행의 열로 추가합니다.
변환된 데이터는 다음과 같이 표시됩니다.
var_groupB var_groupA date text
groupB1 groupA2 2013-01-01 the dog
groupB2 groupA2 2013-01-01 the dog
나는 다음의 조합을 시도했습니다 melt
그리고 ddply
하지만 항상 필요한 변수 중 하나가 없이 남아 있습니다.
제가 시도한 것 중 하나는 melt(x, id.vars=c("text", "date"))
하지만 그러면 나는 두 사람 사이의 관계에 대한 모든 정보를 잃게 됩니다. groupA
그리고 groupB
.
지저분한 루프를 사용하여 이 작업을 수행할 수 있지만 reshape
내가 인식하지 못하고 작업을 수행할 수 있는 유틸리티가 존재합니다.
해결책
각 그룹에 대해 한 번은 melt
를 두 번 사용할 수 있습니다.
y <- melt(x, measure.vars=c("groupA1", "groupA2"),
variable.name="var_groupA", value.name="val_groupA")
y <- melt(y, measure.vars=c("groupB1", "groupB2"),
variable.name="var_groupB", value.name="val_groupB")
.
A와 B의 각 조합에 대해 하나의 행을 제공합니다.
date text var_groupA val_groupA var_groupB val_groupB
1 2013-01-01 the dog groupA1 0 groupB1 1
2 2013-01-01 the dog groupA2 1 groupB1 1
3 2013-01-01 the dog groupA1 0 groupB2 1
4 2013-01-01 the dog groupA2 1 groupB2 1
.
다음을 하위 집합하고 값 열을 제거 할 수 있습니다.
y <- y[y$val_groupA == 1 & y$val_groupB==1, ]
y <- y[, c("var_groupA", "var_groupB", "date", "text")]
.
원하는 것을 제공합니다 :
var_groupA var_groupB date text
2 groupA2 groupB1 2013-01-01 the dog
4 groupA2 groupB2 2013-01-01 the dog
.
데이터 집합이 예제보다 더 복잡한 경우,이 솔루션을 더욱 자동화 된 방식으로 녹음하고 하위 노드로 더욱 우아하고 그룹 열을 감지하고 measure.vars
, variable.name
,그리고 value.name
가 자동으로 모든 수의 그룹을 위해 자동으로
다른 팁
처음 2개의 문은 처음 4개 열의 각 0을 ""로 바꾸고 각 1을 다음을 제공하는 열 이름으로 바꿉니다. dd2
.다음 두 문은 다음의 모든 조합을 생성합니다. groupA
그리고 groupB
다음을 사용하여 각 행에 대해 expand.grid
결과적으로 dd3
.마지막으로 subset
그 행에는 ""
항목:
newvals <- function(nm) ifelse(dd[[nm]] == 0, "", nm)
dd2 <- replace(dd, 1:4, lapply(names(dd)[1:4], newvals))
combo <- function(x) data.frame(expand.grid(groupA=c(x[1:2]), groupB=c(x[3:4])),
x$date, x$text)
dd3 <- do.call("rbind", by(dd2, 1:nrow(dd2), combo))
subset(dd3, groupA != "" & groupB != "")
이는 다음을 제공합니다:
groupA groupB x.date x.text
1.2 groupA2 groupB1 2013-01-01 the dog
1.4 groupA2 groupB2 2013-01-01 the dog