【问题标题】:r data.frame with a listr data.frame 与列表
【发布时间】:2018-01-22 02:31:15
【问题描述】:

我有一个 data.frame(从 jsonlite::fromJSON 读取),其中包含一些 data.frame 列表,例如:

# > str(dat)
# 'data.frame': 2 obs. of  3 variables:
# $ id           : int  1 2
# $ name         : chr  "Julie" "Justin" 
# $ score        :List of 2
# ..$ : NULL
# ..$ :'data.frame':    5 obs. of  2 variables:
#   .. ..$ rid               : int  1 2 3 4 5
# .. ..$ math              : int  5 17 19 12 16

我想把数据转换成如下形式:

# id   name score.rid score.math
#  1  Julie       NA        NA
#  2 Justin       1         5
#  2 Justin       2         17
#  2 Justin       3         19
#  2 Justin       4         12
#  2 Justin       5         16

【问题讨论】:

  • 能否请您显示示例的dput。可能与tidyverse dat %>% mutate(score = map(score, ~if(is.null(.x)) tibble(rid = rep(NA, 5), math = rep(NA, 5)) else as_tibble(.x))) %>% unnest 一起工作。不清楚为什么“朱莉”的行应该是相同的
  • @TimBiegeleisen 那篇文章即将绑定两个data.frame,但我的问题是要转换一个包含列表的data.frame
  • @akrun 那是我的错,我会更新问题
  • 另外,是否可以有超过 2 个具有不同行数的嵌套数据集,在这种情况下,如果有一个 NULL 数据集,那么该数据集的行数是多少

标签: r list dataframe


【解决方案1】:

对于为NULLscore 值,使用mappurrr 将其更改为NA,然后转换为tibbleunnest

library(dplyr)
library(purrr)
library(tidyr)
dat %>%
   mutate(score = map(score, ~ if(is.null(.x)) tibble(NA) else as_tibble(.x))) %>% 
   unnest %>%
   select(-`NA`)
#  id   name rid math
#1  1  Julie  NA   NA
#2  2 Justin   1    5
#3  2 Justin   2   17
#4  2 Justin   3   19
#5  2 Justin   4   12
#6  2 Justin   5   16

数据

dat <- data.frame(id = 1:2, name = c("Julie", "Justin"),
      score = I(list(NULL, data.frame(rid = 1:5, 
      math = c(5, 17, 19, 12, 16)))), stringsAsFactors = FALSE)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 2016-05-15
    相关资源
    最近更新 更多