2014-12-16 1 views
10

저는 plyr에서 온 dplyr을 배우고 xtabs 출력으로부터 (그룹당) 열 (상호 작용 당)을 생성하려고합니다.tidyr spread 함수는 컴팩트 벡터가 예상 될 때 희소 행렬을 생성합니다.

짧은 요약 :

> xtabs(data=data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T))) 
     A 
P  FALSE TRUE 
    FALSE  1 2 
    TRUE  1 1 

지금 do(가 원하는이 데이터의 : 나는

A B 
1 2 

xtabs 데이터를 원하는 경우

A B 
1 NA 
NA 2 

받고 있어요는 다음과 같습니다 데이터 프레임 :

> xtabs(data=data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T))) %>% as.data.frame 
     P  A Freq 
1 FALSE FALSE 1 
2 TRUE FALSE 1 
3 FALSE TRUE 2 
4 TRUE TRUE 1 

이제 레벨이 상호 작용하는 열이있는 단일 행 출력을 원합니다.

FALSE_FALSE TRUE_TRUE FALSE_TRUE TRUE_FALSE 
      1   1   2   1 

을하지만 그 대신 나는 분명히 여기서 뭔가를 오해하고있어

> xtabs(data=data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T))) %>% 
    as.data.frame %>% 
    unite(S,A,P) %>% 
    spread(S,Freq) 
    FALSE_FALSE FALSE_TRUE TRUE_FALSE TRUE_TRUE 
1   1   NA   NA  NA 
2   NA   1   NA  NA 
3   NA   NA   2  NA 
4   NA   NA   NA   1 

를 얻을 : 여기에 내가 무엇을 찾고 있습니다. 나는 (일관성 magrittr 파이프를 사용하여) 여기 reshape2의 코드에 해당하는 찾고 있어요 :

> xtabs(data=data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T))) %>% 
    as.data.frame %>% # can be omitted. (safely??) 
    melt %>% 
    mutate(S=interaction(P,A),value=value) %>% 
    dcast(NA~S) 
Using P, A as id variables 
    NA FALSE.FALSE TRUE.FALSE FALSE.TRUE TRUE.TRUE 
1 NA   1   1   2   1 


(나는이 간단한 예에서 그룹화 변수가 없기 때문에 NA주의하는 것이 여기에 사용됩니다)

업데이트 - 흥미롭게도 단일 그룹화 열을 추가하면이 문제가 해결 된 것 같습니다. 왜 내가 말하지 않고 그룹화 열을 합성합니다 (아마도 row_name에서)?

이것은 부분적인 해결책처럼 보입니다.

+3

[**이 **] (https://github.com/hadley/tidyr/issues/41)는 같은 문제인 것처럼 보입니다. – Henrik

+0

@Henrik : 참으로 그렇습니다. –

+0

[This] (http://stackoverflow.com/q/25960394/937932) 해들리에 의한 설명 설명과 함께 역으로 동일한 문제입니다. 업데이트에서 발견했듯이 두 가지 출력은 올바른 맥락에서 의미가 있습니다. 문맥이 암묵적 일 때,'spread()'는 추측해야한다. – nacnudus

답변

5

여기서 핵심은 spread이 데이터를 집계하지 않는다는 것입니다. 이미 첫번째 집계 xtabs을 사용하지 않았다면

따라서, 당신은이 일을 할 것입니다 : 감 (응집없이) 다른 방법으로하지 것이다

a <- data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T), Freq = 1) %>% 
    unite(S,A,P) 
a 
##    S Freq 
## 1 FALSE_FALSE 1 
## 2 FALSE_TRUE 1 
## 3 TRUE_FALSE 1 
## 4 TRUE_TRUE 1 
## 5 TRUE_FALSE 1 

a %>% spread(S, Freq) 
## FALSE_FALSE FALSE_TRUE TRUE_FALSE TRUE_TRUE 
## 1   1   NA   NA  NA 
## 2   NA   1   NA  NA 
## 3   NA   NA   1  NA 
## 4   NA   NA   NA   1 
## 5   NA   NA   1  NA 

합니다.

이것은 fill 파라미터 도움말 파일에 기초하여 예측 :

다른 변수 및 키 컬럼의 모든 조합에 대한 값이 없을 경우,이 값을 대용한다.

귀하의 경우 키 열과 결합 할 다른 변수는 없습니다. 그때가 있었으면 ...

b <- data.frame(P=c(F,T,F,T,F),A=c(F,F,T,T,T), Freq = 1 
           , h = rep(c("foo", "bar"), length.out = 5)) %>% 
    unite(S,A,P) 
b 
##    S Freq h 
## 1 FALSE_FALSE 1 foo 
## 2 FALSE_TRUE 1 bar 
## 3 TRUE_FALSE 1 foo 
## 4 TRUE_TRUE 1 bar 
## 5 TRUE_FALSE 1 foo 

> b %>% spread(S, Freq) 
## Error: Duplicate identifiers for rows (3, 5) 

... 행 3과 5를 집계 할 수 없으므로 실패합니다 (설계되지 않았기 때문에).

summarize가 그룹화 열을 보존하기 때문에, 따라서 spread이 같은 행에 속하는 관찰 말할 수 group_bysummarize 대신 xtabs 것 수행하는 tidyr/dplyr 방법 :

b %>% group_by(h, S) %>% 
    summarize(Freq = sum(Freq)) 
## Source: local data frame [4 x 3] 
## Groups: h 
## 
##  h   S Freq 
## 1 bar FALSE_TRUE 1 
## 2 bar TRUE_TRUE 1 
## 3 foo FALSE_FALSE 1 
## 4 foo TRUE_FALSE 2 

b %>% group_by(h, S) %>% 
    summarize(Freq = sum(Freq)) %>% 
    spread(S, Freq) 
## Source: local data frame [2 x 5] 
## 
##  h FALSE_FALSE FALSE_TRUE TRUE_FALSE TRUE_TRUE 
## 1 bar   NA   1   NA   1 
## 2 foo   1   NA   2  NA 
+0

그러나 최대 신원 집합을 그룹화 할 때 dplyr 그룹과 함께 사용하면 암시 적 집계가있다. iirc는 실제로 올바르게 작동하지 않는다. –

+1

최대 ID 집합이란 무엇입니까? 더미 그룹 변수를 제공하는 대안이 없다고 생각합니다. 원래의 데이터 프레임으로 할 수도 있고,'spread' 전에'group_by (1)'을하고 나중에'select (-'1')'로 할 수도 있습니다. – nacnudus

+0

키와 값을 제외한 모든 변수가 group_by 연산에서 '열거 자'로 소비 된 경우를 의미합니다. 고마워요. –

관련 문제