2017-12-04 22 views
1

I 각 요소 I는 올라가지(), unnest()펼치기을 (사용하려고 한 길이 (2)의 목록을 포함하는 목록 항목이있는 tibble을) 및 다양한 다른 조합을하지만 내 원하는 결과를 얻는 운.비 - 중첩리스트 컬럼

최소한의 작업 예는 다음과 같습니다 : 예상 결과에

df <- tibble(x = c('A', 'B'), 
     preds = list(list(Phi = data.frame(time = 1:2, estimate = c('y1', 'y2')), 
          p = data.frame(time = 1:2, estimate = c('y3', 'y4'))), 
         list(Phi = data.frame(time = 1:2, estimate = c('y5', 'y6')), 
          p = data.frame(time = 1:2, estimate = c('y7', 'y8'))))) 

:

output <- tibble(x = rep(c('A', 'B'), each = 4), 
      grp = c(rep(c('Phi', 'p'), each = 2), rep(c('Phi', 'p'), each = 2)), 
      time = rep(1:2, 4), 
      estimate = c('y1', 'y2', 'y3', 'y4', 'y5', 'y6', 'y7', 'y8')) 

다음 코드는 나에게 일부 길을 얻고 나는 다른 열을 포함 쉽게 할 수 있지만 정확하지 .

df$preds %>% flatten_df() 

인터넷 검색 결과가 끝난 후 나는 여전히 붙어 있습니다. 어떤 방향으로 가르쳐주세요 ........ 많은 감사합니다 !!!

+2

당신에게'DF %> % 돌연변이 (preds =지도 (preds, bind_rows, .ID = 'GRP')) %> % unnest' – akrun

+0

@KevinArseneau 없음 범죄와보십시오. 나는 그것이 완전한 대답이 아니라고 느꼈다. – akrun

답변

1

akrun의 이미 좋은 답변을 바탕으로 다음을 제공합니다.

library(tidyr) 
library(dplyr) 

df %>% 
    mutate(
    preds = lapply(
     preds, lapply, mutate, estimate = as.character(estimate) 
    ) %>% 
    lapply(bind_rows, .id = "grp") 
) %>% 
    unnest 

# # A tibble: 8 x 4 
#  x grp time estimate 
# <chr> <chr> <int> <chr> 
# 1  A Phi  1  y1 
# 2  A Phi  2  y2 
# 3  A  p  1  y3 
# 4  A  p  2  y4 
# 5  B Phi  1  y5 
# 6  B Phi  2  y6 
# 7  B  p  1  y7 
# 8  B  p  2  y8 

N.B. 유일한 개선 사항은 요인에서 문자로 estimate의 변환입니다. 그렇지 않으면 소스 데이터에서이 문제를 해결할 수 있다면 akrun의지도 솔루션이 더 간결하고 추론하기 쉽습니다.