【问题标题】:How to unlist a data frame column that is a list如何取消列出作为列表的数据框列
【发布时间】:2020-03-30 22:04:44
【问题描述】:

假设我有这个数据框:

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))

已经有severalquestions提出这个问题,但他们的解决方案对我不起作用。

我正在尝试从jsonlite 获取数据,类似于this question 的数据。

【问题讨论】:

  • 您希望 data.frame 作为输出还是 b 唯一的向量。在这里,不清楚预期,因为c(NULL, NULL) 的长度不能为 2,它仍然是一个 NULL
  • 好问题。我想得到一个数据框,以b 作为一列。
  • 如果您知道b 是列表列。 df$b &lt;- NA 不行吗?
  • @RonakShah 我不是特别具体,但有些 NULL 可能不是 NULL,我不想丢失它们。我应该有两个例子:一个都是 NULL,一个只有一些 NULL。

标签: r list dataframe


【解决方案1】:

设置数据:

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

不列出:

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

【讨论】:

    【解决方案2】:

    我们可以使用mapNULL 元素替换为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   
    

    或者一个hacky选项是

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

    当只有 NULL 元素时,需要将其转换为其他值,例如NA 否则它将无法在 vector 中工作

    c(NULL, NULL)
    #NULL
    

    【讨论】:

      【解决方案3】:

      从@Sathish的数据框开始:

      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
      

      【讨论】:

        猜你喜欢
        • 2021-04-02
        • 2013-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-16
        • 2017-10-16
        • 2019-05-07
        • 1970-01-01
        相关资源
        最近更新 更多