Как отменить список столбца фрейма данных, который является списком - PullRequest
2 голосов
/ 31 марта 2020

Предположим, у меня есть этот фрейм данных:

df <- data.frame(a=c(1,2))
df$b <- list(NULL, NULL)

Обратите внимание, что sum(is.null(df$b) - это 0, потому что b - это список, а не вектор.

Как мне получить это будет вектор? Некоторые вещи, которые я пробовал, не работали:

# does nothing
df <- df %>% flatten(b)
# removes column b!
df <- df %>% mutate(b=unlist(b))
# destroys df
df <- df %>% unnest(cols=c(b))
# doesn't run
df <- df %>% mutate_at(vars=c('b'), funs(unlist))

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

Я пытаюсь получить данные jsonlite, аналогичные этому вопросу .

Ответы [ 3 ]

3 голосов
/ 31 марта 2020

Настроить данные:

df <- data.frame(a=c(1,2,3))
df$b <- list(NULL, NULL, 4)

Unlist:

df$d <- unlist(lapply(df$b, function(x) ifelse(is.null(x), NA, x)))

Проверить ответ:

df
#   a    b  d
# 1 1 NULL NA
# 2 2 NULL NA
# 3 3    4  4

str(df)
'data.frame':   3 obs. of  3 variables:
 $ a: num  1 2 3
 $ b:List of 3
  ..$ : NULL
  ..$ : NULL
  ..$ : num 4
 $ d: num  NA NA 4
1 голос
/ 31 марта 2020

Начиная с фрейма данных @ Sathi sh:

df <- data.frame(a=c(1,2,3))
df$b <- list(NULL, NULL, 4)

код для преобразования:

is.na(df$b) <- lengths(df$b)==0
df$b <- unlist(df$b)

df
  a  b
1 1 NA
2 2 NA
3 3  4
1 голос
/ 31 марта 2020

Мы можем использовать map для замены NULL элементов на NA, а затем unnest

library(dplyr)
library(tidyr)
library(purrr)
df %>%
    mutate(b = map(b, ~ replace(., is.null(.), NA))) %>% 
    unnest(c(b))
# A tibble: 2 x 2
#      a b    
#  <dbl> <lgl>
#1     1 NA   
#2     2 NA   

Или хакерский вариант

df %>%
    mutate(b = coalesce(NA, unlist(b)))
#  a  b
#1 1 NA
#2 2 NA

Когда есть только NULL элементы, его необходимо преобразовать в другое значение, например NA, иначе он не будет работать в vector

c(NULL, NULL)
#NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...