2017-05-03 3 views
2

R을 통해 웹 데이터를 요청하는 경우 값이없는 경우 필드의 이름이 지정되지 않은 json 또는 xml로 작업하는 경우가 많습니다. 때로는 데이터도 없으며 특정 인덱스의 빈 목록으로 나옵니다. 그래서 저는 이것을 두 가지 다른 문제로 봅니다. 나는 이것을 해결하기 위해 사용하는 해결책을 제안하고 있지만 더 좋은 것들이 있다는 것을 알고있다. 처음에는 필드 이름 (xml, json spec의 목적에 맞지 않음)과 누락 된 전체 인덱스 (의도적으로)가 누락 된 매우 지저분하고 위조 된 목록을 가지고 있습니다.두 가지 문제가있는 데이터 프레임에 불완전한 목록 구문 분석

(messy_list <- list(list(x = 2, y = 3), 
        list(), 
        list(y = 4), 
        list(x = 5))) 

자, 여기서 제가 "해결 된"이라고 말하면 어떻게 설명할까요?

library(plyr) 
messy_list_no_empties <- lapply(messy_list, function(x) if(length(x) == 0) {list(NA, NA)} else x) 

ldply(messy_list_no_empties, data.frame)[,1:2] 

최종 결과는 내가 찾고있는 것이지만이 문제를 해결하기위한보다 우아한 방법을 찾고 싶습니다. purrr::map_df 함께

+0

완전히 'NA'인 행을 유지 하시겠습니까? –

+0

예. 나는 같은 지수에서 그들을 필요로한다. – cylondude

답변

2

,

library(purrr) 

messy_list <- list(list(x = 2, y = 3), 
        list(), 
        list(y = 4), 
        list(x = 5)) 

messy_list %>% map_df(~list(x = .x$x %||% NA, 
          y = .x$y %||% NA)) 
#> # A tibble: 4 × 2 
#>  x  y 
#> <dbl> <dbl> 
#> 1  2  3 
#> 2 NA NA 
#> 3 NA  4 
#> 4  5 NA 

map_dflapply 추천 목록을 반복하고 data.frame로 강제 변환 결과. 함수는 (purrr의 공식 형식에서) xy 요소가있는 목록을 조합하여 존재하는 값을 찾고 있습니다. 그렇지 않은 경우 부분 집합은 NULL을 반환합니다. %||%은 그 다음 값인 NA으로 바뀝니다.

대부분 동등한 기본 R에서

,

as.data.frame(do.call(rbind, 
         lapply(messy_list, function(.x){ 
          list(x = ifelse(is.null(.x$x), NA, .x$x), 
           y = ifelse(is.null(.x$y), NA, .x$y)) 
         }))) 
#> x y 
#> 1 2 3 
#> 2 NA NA 
#> 3 NA 4 
#> 4 5 NA 

참고 기본 접근 방식은 물론 다른 유형을 처리하지 않습니다. 그렇게하려면 모든 것을 성격에 강요하십시오 (rbind은 아마도 어쨌든 적용될 것이므로 stringsAsFactors = FALSEas.data.frame에 추가하고 lapplytype.convert을 추가하십시오).

+1

이것은 내가 무엇을 찾고 있는지 정확하게 보입니다. 나는 더 좋은 사람이 나타나지 않으면 몇 시간을 기다려 대답을 받아 들일 것입니다. – cylondude

+0

기다릴 필요가 없습니다. 확인 표시가있는 상태로 표시하고 나중에 변경할 수 있습니다. –

2

귀하의 방법은 이미 꽤 컴팩트하지만 다른 방법을 찾고 있다면, 하나의 방법은 rbindlistdata.table에서 사용할 수 있습니다 : 우리가가를 떨어 뜨리지 않는 lapply 필요

library(data.table) 
new_list <- lapply(messy_list, function(x) if(identical(x,list())){list(x = NA)} else {x}) 

rbindlist(new_list, fill = T, use.names = T) 
# x y 
#1: 2 3 
#2: NA NA 
#3: NA 4 
#4: 5 NA 

주 비어있는 행

관련 문제