【问题标题】:R: Extract columns from list of data.frames in a tibbleR:从小标题中的 data.frames 列表中提取列
【发布时间】:2017-12-12 04:48:05
【问题描述】:

我想知道如何操作包含存储在 tibble 中的 data.frames 的列表。

具体来说,我想从存储在 tibble 列表列中的 data.frame 中提取两列。

我想从这个tibble c去

random_data<-list(a=letters[1:10],b=LETTERS[1:10])
x<-as.data.frame(random_data, stringsAsFactors=FALSE)
y<-list()
y[[1]]<-x[1,,drop=FALSE]
y[[3]]<-x[2,,drop=FALSE]
c<-tibble(z=c(1,2,3),my_data=y)

到这个tibble d

d<-tibble(z=c(1,2,3),a=c('a',NA,'b'),b=c('A',NA,'B'))

谢谢

伊恩

【问题讨论】:

  • ab 是数据集c 中的因子,但它们是数据集d 中的字符。这是故意的吗?
  • 如果是,那不是故意的,它们应该是两者中的字符
  • 酷。我溜进了stringsAsFactors=F

标签: r dplyr purrr


【解决方案1】:

c2 是最终输出。

library(tidyverse)

c2 <- c %>%
  filter(!map_lgl(my_data, is.null)) %>%
  unnest() %>%
  right_join(c, by = "z") %>%
  select(-my_data)

【讨论】:

  • 同意 - 非常好的解决方案
【解决方案2】:

我认为这可以解决d 请求的小标题:

library(dplyr)

new.y <- lapply(y, function(x) if(is.null(x)) data.frame(a = NA, b = NA) else x)
d <- cbind(z = c(1, 2, 3), bind_rows(new.y)) %>% tbl_df()


# # A tibble: 3 x 3
#     z      a      b
#  <dbl> <fctr> <fctr>
# 1   1      a      A
# 2   2     NA     NA
# 3   3      b      B

【讨论】:

    【解决方案3】:

    您可以创建一个函数f 来更改NULL 值,然后将其应用于my_data 列并以unnest 结束。

    library(dplyr); library(tidyr)
    
    unnest(mutate(c, my_data = lapply(my_data, f)))
    # # A tibble: 3 x 3
    #       z     a     b
    #   <dbl> <chr> <chr>
    # 1     1     a     A
    # 2     2  <NA>  <NA>
    # 3     3     b     B
    

    f 是一个辅助函数,用于更改 NULL 值,定义为

    f <- function(x) {
        if(is.null(x)) data.frame(a = NA, b = NA) else x
    }
    

    【讨论】:

    • 显示辅助函数非常有用,因为它帮助我理解了我遇到的问题,即我需要考虑我的列表列中的空条目。
    【解决方案4】:

    您是否提前知道列名?

    extract_column <- function( d, column_name ) {
      if( is.null(d) ) {
        NA_character_
      } else {
        as.character(d[[column_name]])
      }  
    }
    
    
    cc %>% 
      dplyr::mutate(
        a = purrr::map_chr(.$my_data, extract_column, column_name="a"),
        b = purrr::map_chr(.$my_data, extract_column, column_name="b")
      ) %>% 
      dplyr::select(-my_data)
    

    (我将您的c tibble 重命名为cc,因此它不会与c() 发生冲突。)

    【讨论】:

    • 不幸的是,我不知道总是知道列的名称
    猜你喜欢
    • 2020-02-13
    • 2017-06-10
    • 2019-12-29
    • 1970-01-01
    • 2021-11-03
    • 2021-02-16
    • 2019-11-10
    • 2020-02-07
    • 2017-02-26
    相关资源
    最近更新 更多