문제

다음과 같은 데이터 구조가 있습니다.

 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top