Подтвердить что ты не робот

Запретить блокировку значений NULL

У меня есть вектор списков, и я использую unlist для них. Некоторые из элементов в векторах NULL и unlist, кажется, отбрасывают их.

Как я могу предотвратить это?

Вот простой (не) рабочий пример, показывающий эту нежелательную функцию 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 
4b9b3361

Ответ 1

Проблема в том, что вы не можете иметь NULL в середине вектора. Например:

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

У вас может быть NA посередине. Вы могли бы преобразовать его в символ, а затем обратно в числовое значение, которое автоматически преобразует значения NULL в NA (с предупреждением):

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

затем верните имена, потому что они были удалены предыдущей операцией:

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

Ответ 2

В этом случае (один список глубин уровня) это тоже должно работать:

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

Ответ 3

Правильный способ указания отсутствующего значения - 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 

Ответ 4

Если вы имеете дело с длинным сложным JSON с несколькими уровнями, вы должны попробовать:

Я извлек данные журнала игры с веб-сайта nba.com/stats. Проблема в том, что некоторые игроки имеют значение NULL для 3-х точечных штрафных бросков (в основном для центров), а jsonlite:: fromJSON очень хорошо обрабатывает значения NULL:

#### 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]]