2016-07-10 4 views
2

내가 제어 및 각 주제에 대한 복제와 실험 그룹에서 관찰 포함하는 dataframe 있습니다R의 데이터 프레임에서 행을 dplyr과 쌍으로 만드는 방법은 무엇입니까?

subject group replicate value 
    A  control  1  10 
    A  control  2  15 
    A  experim  1  40 
    A  experim  2  45 
    B  control  1  5 
    B  experim  1  30 
    C  control  1  50 
    C  experim  1  NA 

내가 그 실험에 대응하여 각 제어 관찰 쌍 싶습니다 여기 내 dataframe의 예입니다 한 쌍의 값 사이의 비율을 계산하기 위해 하나. 원하는 출력은 :

subject replicate control experim ratio 
    A   1   10  40  4 
    A   2   15  45  3 
    B   1   5  30  6 
    C   1   50  NA  NA 

주십시오, 참고 변할 수 피사체 복제 수 (A C는 누락 값을 하나 갖고, B 단 한 개의 복제를 갖는다). 이상적으로, 나는 이것을 dplyr과 파이프로 구현하는 것을보고 싶다.

답변

3

우리는 '넓은'형식으로 변환 할 data.table에서 dcast을 사용할 수 있습니다, 다음에 tidyr에서 '제어'

library(data.table) 
dcast(setDT(df1), subject+replicate~group, value.var="value")[, 
      ratio:= experim/control][] 
#  subject replicate control experim ratio 
#1:  A   1  10  40  4 
#2:  A   2  15  45  3 
#3:  B   1  5  30  6 
#4:  C   1  50  NA NA 

와 'experim'분할 또는 spread를 사용하여 '비율'열을 생성 '와이드'형식으로 변환 한 다음 mutate으로 '비율'을 만듭니다.

library(dplyr) 
library(tidyr) 
spread(df1, group, value) %>% 
     mutate(ratio = experim/control) 
# subject replicate control experim ratio 
#1  A   1  10  40  4 
#2  A   2  15  45  3 
#3  B   1  5  30  6 
#4  C   1  50  NA NA 

아니면 @akrun 감사 base R

transform(reshape(df1, idvar = c("subject", "replicate"), 
    timevar="group", direction="wide"), ratio = value.experim/value.control) 
+0

에서 reshape 사용! 당신의 대답은 저에게 분산 명령의 힘을 깨닫게했습니다. 이것은 단일 값 열에 효과적입니다. 나는 비슷한 질문을하지만 여러 값을 가지고있다. (http://stackoverflow.com/questions/38297989/how-to-pair-rows-with-multiple-values-in-a-data-frame-using-dplyr- in-r) – Irakli

+0

@Irakli이 방법이 효과가있는 경우 투표 옆의 체크 표시를 클릭하여 해결책을 수락하십시오. – akrun

관련 문제