2016-07-20 2 views
1

을 전가 :충전/순서에서 누락 된 값을 다시 확장하지 나는이처럼 보이는 dataframe이

library(dplyr) 
df <- expand.grid(
    id = 1:3, 
    key = 1:10) %>% 
    filter(!(id == 1 & key <= 4)) %>% 
    filter(!(id == 2 & key %in% c(1:3, 6, 7, 10))) %>% 
    filter(!(id == 3 & key %in% c(1, 2, 4, 5, 7:10))) %>% 
    arrange(id, key) %>% 
    cbind(value = c(10, 11, 15, 17, 20, 30, 1, 6, 8, 100, 0.2, 0.7)) 
  • id == 1key == 10
  • id == 2로 이동하는 것은 key == 9
  • id == 3가 간다 간다 key == 6

나는 key에 대한 정수 시퀀스를 채우거나 다시 확장하고자하는데, 그 값은 NA가 될 수 있습니다. (이것은 대체 문제가 아닙니다) ...

따라서 id == 3에 대해 1, 2, 3 , 4, 5, 6 ... == 미리 NA

감사합니다

+1

tidyr의 '완료'에 대한 작업과 비슷합니다. 데이터 세트의 각 ID 또는 전체에서 'key'의 최대 값으로 확장 하시겠습니까? 그리고 '열쇠'는 1시에 시작해야합니까? – aosmith

+1

Fwiw, 답을 맞추기 위해 태그를 편집 할 필요가 없습니다. 당신이 물었을 때 염두에 두었던 것을 태그로 남겨두면 좋습니다. – Frank

+1

@ 프랭크가 머리를 올려 주셔서 감사합니다! 추후 검색/검색 사용자를 위해 질문에 더 쉽게 접근 할 수 있도록 노력하고 있습니다. – emehex

답변

4

아이러니하게도 complete라는 이름의 파이프에 또 하나의 조각을 추가

library(tidyr) 
df <- expand.grid(
    id = 1:3, 
    key = 1:10) %>% 
    filter(!(id == 1 & key <= 4)) %>% 
    filter(!(id == 2 & key %in% c(1:3, 6, 7, 10))) %>% 
    filter(!(id == 3 & key %in% c(1, 2, 4, 5, 7:10))) %>% 
    arrange(id, key) %>% 
    cbind(value = c(10, 11, 15, 17, 20, 30, 1, 6, 8, 100, 0.2, 0.7)) %>% 
    complete(id, key) 
# id key value 
# 1 1 3 NA 
# 2 1 4 NA 
# 3 1 5 10.0 
# 4 1 6 11.0 
# 5 1 7 15.0 
# 6 1 8 17.0 
# 7 1 9 20.0 
# 8 1 10 30.0 
# 9 2 3 NA 
# 10 2 4 1.0 

편집

데이터 사용의 키를 넘어 이동하려면 :

complete(df, id, key = 1:10) 
+0

굉장합니다. 내 열쇠가 1에서 시작하지 않으면 어떻게됩니까? 해결책을 해킹하고 complete()를 사용했다. complete()에 채우기 인자가있는 것 같지만 작동시키지 못합니까? – emehex

+0

@alistaire가 내 마음을 읽은 것처럼 보입니다! – emehex

+1

예, 'key'너머로 확장하려면 시퀀스를 정의하십시오. –

3

당신이 원하는 경우 1에서 시작하여 각 에 대해 key의 최대 값까지 올라가는 시퀀스 :

library(dplyr) 
library(tidyr) 

df %>% group_by(id) %>% complete(key = seq(max(key))) 
## Source: local data frame [25 x 3] 
## Groups: id [3] 
## 
##  id key value 
## <int> <int> <dbl> 
## 1  1  1 NA 
## 2  1  2 NA 
## 3  1  3 NA 
## 4  1  4 NA 
## 5  1  5 10 
## 6  1  6 11 
## 7  1  7 15 
## 8  1  8 17 
## 9  1  9 20 
## 10  1 10 30 
## # ... with 15 more rows