2017-10-08 15 views
1

두 개의 키/값 쌍을 확산하려고하지만 공통 값 열이 축소되지 않습니다. 나는 이전의 처리와 관련이 있을지도 모른다고 생각한다. 또는 내가 기대하는 결과를 얻기 위해 둘 이상의 키/값 쌍을 분산시키는 올바른 방법을 모를 가능성이 높다.r 행을 축소하지 않는 다중 키 값 쌍을 사용하는 tidyverse spread()

나는이 데이터 세트로 시작하고 다음 수집 다음() 함수에서 만든 "계산"값의 순서를 정의하는이 전 확산 단계가 있습니다

library(tidyverse) 

df <- tibble(order = 1:7, 
      line_1 = c(23,8,21,45,68,31,24), 
      line_2 = c(63,25,25,24,48,24,63), 
      line_3 = c(62,12,10,56,67,25,35)) 

. 은 "셀"의 숫자 순서를 정의하는

ntrl <- df %>% 
      gather(line_1, 
        line_2, 
        line_3, 
        key = "sector", 
        value = "count") %>% 
      group_by(order) %>% 
      mutate(sector_ord = row_number()) %>% 
      arrange(order, 
        sector) 

이 상기 제 2 프리 - 확산 공정 변수이 변수는 행 번호를 사용하여 "셀"의 원래 순서를 정의하는 제 사전 확산 단계 :

ord <- ntrl %>% 
      arrange(order, 
        count) %>% 
      group_by(order) %>% 
      mutate(num_ord = paste0("ord_", 
            row_number(), 
            sep="")) 

그리고 마지막으로 내가 사용 된 확산 코드 :

0,123,516 :

wide <- ord %>% 
      group_by(order) %>% 
      spread(key = sector, 
        value = count) %>% 
      spread(key = num_ord, 
        value = sector_ord) 

내가지고있어하는 것은 이것이다

order line_1 line_2 line_3 ord_1 ord_2 ord_3       
1 1  23  NA  NA  1  NA  NA 
2 1  NA  63  NA  NA  NA  2 
3 1  NA  NA  62  NA  3  NA 
4 2  8  NA  NA  1  NA  NA 
5 2  NA  25  NA  NA  NA  2 
6 2  NA  NA  12  NA  3  NA 
7 3  21  NA  NA  NA  1  NA 
8 3  NA  25  NA  NA  NA  2 
9 3  NA  NA  10  3  NA  NA 
... and so on thru 21 lines accounting for all 7 "order" lines 

내가 기대하고 동작은 "순서"열은 다음과주고 동일한 "순서"값을 모든 행에 붕괴 것입니다 :

order line_1 line_2 line_3 ord_1 ord_2 ord_3       
1 1  23  63  62  1  3  2 
2 2  8  25  12  1  3  2 
3 3  21  25  10  2  3  1 
4 4  45  24  56  2  1  3 
... and so on, I think that paints the picture 

내가 검토 한 질문과 답변 중복 식별자를 사용하여 확산되고 행 번호 인덱스를 사용하지만 도움이되지 않습니다.

나는 두 배 퍼짐과 관련이 있다고 생각하지만, 어떻게 할지를 알 수 없다.

도움 주셔서 감사합니다.

답변

3

. 핵심은 summarise_all(funs(.[which(!is.na(.))]))을 사용하여 각 열에 대해 비 NA 값을 선택하는 것입니다.

library(tidyverse) 

df2 <- df %>% 
    gather(Lines, Value, -order) %>% 
    group_by(order) %>% 
    mutate(Rank = dense_rank(Value), 
     RankOrder = paste0("ord_", row_number())) %>% 
    spread(Lines, Value) %>% 
    spread(RankOrder, Rank) %>% 
    summarise_all(funs(.[which(!is.na(.))])) 
df2 
# A tibble: 7 x 7 
    order line_1 line_2 line_3 ord_1 ord_2 ord_3 
    <int> <dbl> <dbl> <dbl> <int> <int> <int> 
1  1  23  63  62  1  3  2 
2  2  8  25  12  1  3  2 
3  3  21  25  10  2  3  1 
4  4  45  24  56  2  1  3 
5  5  68  48  67  3  1  2 
6  6  31  24  25  3  1  2 
7  7  24  63  35  1  3  2 
+0

완벽하게 작동하는 ycw에게 감사합니다. 나는 완전히 이해하고 있는지 확신 할 수 없지만 그것이 깔끔한 방법론을 고수하고 싶다. 나는 이것을 더 연구 할 것이다. 다시 한번 감사드립니다. –

2

df 시작 : 해결책이 df을 시작 tidyverse를 사용

df %>% 
    gather(headers, line, -order) %>% 
    separate(headers, into = c('dummy', 'rn')) %>% 
    select(-dummy) %>% 
    group_by(order) %>% 
    mutate(ord = rank(line, ties.method='first')) %>% 
    {data.table::dcast(setDT(.), order ~ rn, value.var = c("line", "ord"))} 

# order line_1 line_2 line_3 ord_1 ord_2 ord_3 
#1:  1  23  63  62  1  3  2 
#2:  2  8  25  12  1  3  2 
#3:  3  21  25  10  2  3  1 
#4:  4  45  24  56  2  1  3 
#5:  5  68  48  67  3  1  2 
#6:  6  31  24  25  3  1  2 
#7:  7  24  63  35  1  3  2