2017-12-08 25 views
1

1 개 또는 2 개의 열과 n 개의 행이있는 중첩 데이터 프레임의 열이있는 데이터 프레임이 있습니다.다양한 수의 요소로 중첩 된 데이터 프레임 변환

'data.frame': 3 obs. of 2 variables: 
$ vector:List of 3 
    ..$ : chr "p1" 
    ..$ : chr "p2" 
    ..$ : chr "p3" 
$ lists :List of 3 
    ..$ :'data.frame': 2 obs. of 2 variables: 
    .. ..$ n1: Factor w/ 2 levels "a","b": 1 2 
    .. ..$ n2: Factor w/ 2 levels "1","2": 1 2 
    ..$ :'data.frame': 1 obs. of 1 variable: 
    .. ..$ n1: Factor w/ 1 level "d": 1 
    ..$ :'data.frame': 1 obs. of 2 variables: 
    .. ..$ n1: Factor w/ 1 level "e": 1 
    .. ..$ n2: Factor w/ 1 level "3": 1 

안양은 다음과 같이 다시 할 수 있습니다 : 그것은 아래의 샘플에서 df라고 과 같은

v <- c("p1", "p2", "p3") 
l <- list(data.frame(n1 = c("a", "b"), n2 = c("1", "2")), data.frame(n1 = "d"), data.frame(n1 = "e", n2 = "3")) 
df <- as.data.frame(cbind(v, l)) 

내가 그렇게 보이는 데이터 프레임으로 변환하고 싶습니다 :

[v] [n1] [n2] 

p1 a 1 

p1 b 2 

p2 d NA 

p3 e 3 
  • N1과 N2는 별도의 컬럼에 행 데이터 프레임 i가 n 개의 행을 갖는 경우
  • 행의 벡터 요소 i는 N1 또는 N2에는 콘텐츠가없는 경우에, NA는

I가 있어야 n 회

  • 반복되어야 시도를 '을 tidyr 사용했습니다 :: unnest하지만 다음과 같은 오류

    있어
    unnest(df) 
    Error: All nested columns must have the same number of elements. 
    

    사람이 어떻게 원하는 형식으로 dataframe을 변환하는 더 나은 아이디어를 가지고 있습니까?

  • 답변

    1

    이렇게하면 많은 행이있는 경우 중요 할 행별 작업이 방지됩니다.

    library(data.table) 
    
    rbindlist(df$l, fill = T, id = 'row')[, v := df$v[row]][] 
    # row n1 n2 v 
    #1: 1 a 1 p1 
    #2: 1 b 2 p1 
    #3: 2 d NA p2 
    #4: 3 e 3 p3 
    
    +0

    잘 작동합니다. 이것에 대한 또 하나의 질문 : 반복되어야하는 내용을 가진 열 v가 둘 이상인 경우이 함수를 사용하는 방법은 무엇입니까? – PMH

    +0

    아마도'setDT (df); rbindlist (df $ l, fill = T, id = 'row') [, c (.SD, df [row, -'l '])]' – eddi

    1

    df의 각 행 내에서, 우리는 하나의 데이터 프레임으로 vl을 결합하고 하나의 데이터 프레임에 상기 데이터 프레임의 모든 결합 purrr::pmap_df 사용.

    library(tidyverse) 
    
    pmap_df(df, function(v,l) { 
        data.frame(v,l) 
    }) 
    
    v n1 n2 
    1 p1 a 1 
    2 p1 b 2 
    3 p2 d <NA> 
    4 p3 e 3 
    
    0

    dplyrtidyr를 사용하는 용액. suppressWarnings은 필요하지 않습니다. 데이터 프레임을 만들 때 요소 열이 있으므로 suppressWarnings은 요소를 결합 할 때 경고 메시지를 표시하지 않기 때문입니다.

    library(dplyr) 
    library(tidyr) 
    
    df1 <- suppressWarnings(df %>% 
        mutate(v = unlist(.$v)) %>% 
        unnest()) 
    df1 
    # v n1 n2 
    # 1 p1 a 1 
    # 2 p1 b 2 
    # 3 p2 d <NA> 
    # 4 p3 e 3