R:从tibble中的data.frames列表中提取列

时间:2017-07-07 19:27:41

标签: r dplyr purrr

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

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

我想从这个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'))

感谢

伊恩

4 个答案:

答案 0 :(得分:11)

c2是最终输出。

library(tidyverse)

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

答案 1 :(得分:6)

我认为这可以解决d所请求的tibble:

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

答案 2 :(得分:5)

您可以创建一个函数cmake_minimum_required(VERSION 3.8) project(InterfaceLibCppStd) include(CheckCXXCompilerFlag) file(WRITE "mylib/Definitions.h" [=[ #define HELLO_TEXT "Hello Interface Lib" ]=]) add_library(mylib INTERFACE) target_include_directories(mylib INTERFACE "mylib") target_compile_options(mylib INTERFACE "/std:c++14") file(WRITE "main.cpp" [=[ #include "Definitions.h" #include <iostream> int main() { std::cout << HELLO_TEXT << std::endl; } ]=]) add_executable(myexe "main.cpp") if (MSVC_VERSION GREATER_EQUAL "1900") CHECK_CXX_COMPILER_FLAG("/std:c++latest" _cpp_latest_flag_supported) if (_cpp_latest_flag_supported) get_target_property(_opt_old mylib INTERFACE_COMPILE_OPTIONS) string(REPLACE "14" "latest" _opt_new "${_opt_old}") set_target_properties(mylib PROPERTIES INTERFACE_COMPILE_OPTIONS "${_opt_new}") endif() endif() target_link_libraries(myexe PUBLIC mylib) 来更改NULL值,然后将其应用到f列并以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 是帮助函数,用于更改NULL值,并定义为

f

答案 3 :(得分:5)

您是否提前了解了您的专栏名称?

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()发生冲突。)