2010-06-07 4 views
30

나는 목록의 벡터를 가지고 있으며 그 중 unlist을 사용합니다. 벡터의 요소 중 일부는 NULL이고 unlist은 삭제하는 것으로 보입니다.unlist가 NULL 값을 버리지 못하도록 방지

어떻게 방지 할 수 있습니까?

여기 여기 문제는 당신이 벡터의 중간에 NULL을 가질 수 있다는 것입니다 unlist

a = c(list("p1"=2, "p2"=5), 
     list("p1"=3, "p2"=4), 
     list("p1"=NULL, "p2"=NULL), 
     list("p1"=4, "p2"=5)) 
unlist(a) 
p1 p2 p1 p2 p1 p2 
2 5 3 4 4 5 

답변

15

의이 원치 않는 기능을 보여주는 간단한 (비) 작업 예입니다. 예 :

> c(1,NULL,3) 
[1] 1 3 

중간에 NA를 사용할 수 있습니다. 그들이 이전에 의해 삭제 된했기 때문에

> b <- as.numeric(as.character(a)) 
Warning message: 
NAs introduced by coercion 

다음, 다시 이름을 넣어 : 자동 (경고와 함께) NA에 NULL 값을 변환하는 숫자의 뒤쪽으로 문자로 변환 할 수 있었다 작동 :

> names(b) <- names(a) 
> b 
p1 p2 p1 p2 p1 p2 p1 p2 
2 5 3 4 NA NA 4 5 ` 
+2

, 그것은 (as.numeric과 같습니다 문제는 몇몇 선수가 자유투 3 점 (주로 센터) 및 jsonlite에 대한 NULL 값을 가지고있다 : fromJSON 아주 잘 NULL 값을 처리하는 것 as.character (NULL))는 숫자 (0)을 반환합니다. 새로운 접근법은 대답을 위해 lapply (b, function (x) ifelse (is.null (x), NA, x)) – cylondude

1

누락 된 값을 나타내는 올바른 방법은 NA (NULL이 아님)입니다.

a = c(list("p1"=2, "p2"=5), 
     list("p1"=3, "p2"=4), 
     list("p1"=NA, "p2"=NA), 
     list("p1"=4, "p2"=5)) 
    unlist(a) 

p1 p2 p1 p2 p1 p2 p1 p2 
2 5 3 4 NA NA 4 5 
+1

을 사용하는 것입니다. 분명히 나는 ​​목록을 손으로 정의하지 않는다. 그것은 함수에 의해 반환된다. 어쨌든'unlist' 전에 NULL을 NULL로 변경하는 것이 트릭을하는 것처럼 보였습니다. – nico

+0

@nico 만약 당신의 함수라면 'NULL'대신에 'NA'를 반환하도록 다시 작성하는 것이 좋습니다. 이 두 객체의 차이점을 확인하려면 도움말 페이지에서 'NA'와 'NULL'을 살펴보십시오. – Marek

+1

@Marek : 아니요, 실제로'nls'에 의해 반환 된 객체 목록에'coef'를 적용하여 반환되는 목록입니다. 이 객체 중 일부는 NULL이고'coef (NULL)'은'NULL'을 반환합니다 ... – nico

29

을이 경우 (한 레벨 깊이 목록)에서이 정상적으로 너무 작품 : 여기에 노력하고 또 다른 버전입니다

a[sapply(a, is.null)] <- NA 
unlist(a) 
# p1 p2 p1 p2 p1 p2 p1 p2 
# 2 5 3 4 NA NA 4 5 
1

여러 수준의 긴 복잡한 JSON을 처리하는 경우가해야 이것을 시도해보십시오 :

nba.com/stats 웹 사이트에서 게임 로그 데이터를 추출했습니다.

3.2.2에
#### Player game logs URL: one record per player per game played #### 
gameLogsURL <- paste("http://stats.nba.com/stats/leaguegamelog?Counter=1000&Direction=DESC&LeagueID=00&PlayerOrTeam=P&Season=2016-17&SeasonType=Regular+Season&Sorter=PTS") 

#### Import game logs data from JSON #### 
# use jsonlite::fromJSON to handle NULL values 
gameLogsData <- jsonlite::fromJSON(gameLogsURL, simplifyDataFrame = TRUE) 
# Save into a data frame and add column names 
gameLogs <- data.frame(gameLogsData$resultSets$rowSet) 
colnames(gameLogs) <- gameLogsData$resultSets$headers[[1]] 
관련 문제