2014-06-22 2 views
2

에서 행에 의한 데이터 프레임의 행을 건물 : 나는 데이터 프레임이 데이터를 저장할내가 R이과 같은 데이터 구조를 분석하고 목록

[ 
    { 'firstName': 'abc', 'lastName' : 'def' }, 
    { 'firstName': 'abc2', 'lastName' : 'def2' } 
] 

. 현재 나의 접근 방식은 결함이있어 정말 지저분 해 보인다. 여러 데이터 세트가 있지만 열을 지정해야합니다. 누구나 뭔가 '깨끗한'것을 제안 할 수 있습니까?

문제 1 : 내가 열 이름을 사용하지 않고이 추출 가능한 경우를 실행하고자, 또는 내가 그에서 열을 추출하는 방법으로 할 데이터의 이름

library(rjson) 
listData <- fromJSON(jsonData) 
listNames <- c('firstName', 'lastName') 

for (player in listData){ 
    playerCols = c() 
    for (name in listNames){ 
    value <- player[[name]] 
    if (is.null(value}{value <- "NA"} 
    playerCols <- c(playerCols, value) 
    } 
    # code to convert playerCols to data.frame currently goes here. 
} 

를 지정해야 내가 따라 가면서 데이터. 여기 까다로운 부분은 각 항목에 모든 열이 채워지지 않는다는 것입니다. 내가 NA

문제 2에 모든 열을 설정하고 누락 된 값을 알 수있는 마지막 데이터 프레임을하고 싶습니다 : 나는 데이터의 행을 추가 실패하는 것 대신에 목록 열로 만들어집니다

for (player in listData){ 
    # code to extract columns here 
    df = data.frame(playerCols, name=listNames) 
    print(df) 
} 

모든 데이터와 모든 이름을 포함하는 행이있는 2 열 데이터 프레임을 만드는 대신 이름이 지정된 열이있는 단일 행을 사용하여 rbind을 함께 사용할 수 있습니다.

답변

3

행별로 data.frame을 작성하는 것은 거의 좋은 생각이 아닙니다. 그것은 단지 효율적인 프로세스가 아닙니다. 데이터를 열별로 작성한 다음 끝에 결합하여 data.frame으로 만드는 것이 좋습니다. 먼저,

a<-'[ 
    { "firstName": "abc", "lastName" : "def" }, 
    { "firstName": "abc2" } 
]' 

을 기술로의는의도가있는 경우 목록에서 값을 추출하는 도우미 함수를 구축하거나

을하지 않는 경우 NA를 반환하자 실제로 값이 빠져있는 일부 샘플 데이터를 사용하자
extr<-function(list,ele) { 
    x<-list[[ele]] 
    if (is.null(x)) x=NA; 
    x 
} 

명시 적으로 태그 이름을 지정할 필요없이 모든 값을 잡아하려는 경우, 당신은 지금 우리가 목록에 JSON 변환 할 수 있습니다

listNames <- unique(unlist(lapply(listData, names))) 

를 사용하여 찾아 t 수 암탉은 열 값의 벡터 매번 추출하고 마침내 제대로의 이름으로 listNames의 값을 사용하기 때문에 내가 lapply 더 관습보다는 Map를 사용

다음
listData <- fromJSON(a) 
data.frame(Map(function(n) sapply(listData, extr, n), listNames)) 

와 data.frame로 결합 반환 된 목록.

+0

'unlist' 대신'c (sapply (listData, names))'예외를 사용하여 완벽하게 작동합니다. – Hans

관련 문제