r - 创建数据框,根据列表的第一个元素进行匹配

标签 r list dataframe match

我想根据列表的第一个元素创建一个数据框。具体来说,我有

  • 一个包含变量(names1)的向量;
  • 包含两个变量(一些 vars1 和值)的一个列表;
  • 最终产品应该是一个带有“names1”的 data.frame,其中包含与匹配的案例一样多的行。
  • 如果特定列表和向量之间没有匹配,则应该为 NA。
  • 这些值也可以是因子或字符串。
  • names1 <- c("a", "b", "c")
    dat1 <- data.frame(names1 =c("a", "b", "c", "f"),values= c("val1", 13, 11, 0))
       dat1$values <- as.factor(dat1$values)
    dat2 <- data.frame(names1 =c("a", "b", "x"),values= c(12, 10, 2))
       dat2$values <- as.factor(dat2$values)
    list1 <- list(dat1, dat2)
    

    结果应该是一个新的数据框,其中包含变量“名称”以及与每个列表部分匹配的所有值:

     a      b    c
     val1   13   11
     12     10   NA
    

    最佳答案

    一种选择是循环遍历list('list1'),根据'names'向量过滤'names'列,将其转换为单个数据集,同时使用 .id 创建标识列,扩展从“长”到“宽”并删除“grp”列

    library(tidyverse)
    map_df(list1, ~   .x %>% 
                         filter(names %in% !! names), .id = 'grp') %>%           
          spread(names, values) %>% 
          select(-grp)   
    #      a     b     c    
    #1    25    13    11
    #2    12    10    NA
    

    或者另一种选择是将数据集与bind_rows绑定(bind)在一起,创建一个分组id“grp”来指定list元素,filter通过仅选择与“名称”向量匹配的“名称”列并从“长”到“宽”扩展来划分行

    bind_rows(list1, .id = 'grp') %>%
       filter(names %in% !! names) %>% 
       spread(names, values)
    

    注意:最好不要使用保留关键字来指定对象名称 (names)。另外,为了避免混淆,该对象应该与数据框对象的列名称不同。


    也可以仅使用 base R 来完成。使用Map创建组标识符,将list元素rbind到单个数据集,通过仅保留行子集来来自“名称”向量的值,以及从“长”到“宽”的 reshape

    df1 <- subset(do.call(rbind, Map(cbind, list1, 
              ind = seq_along(list1))), names %in% .GlobalEnv$names)   
    reshape(df1, idvar = 'ind', direction = 'wide', timevar = 'names')[-1]
    

    关于r - 创建数据框,根据列表的第一个元素进行匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54494811/

    相关文章:

    c# - 在 C# 中获取 2 个列表中的最大年龄的名称

    python - 如何匹配两个数据框并得到以下结果?

    r - 将 CSV 文件连接到 R 中的单个数据帧中,为什么我在使用 typeof 时仍然将列表列为类?

    r - 仅从 R 中的 .csv 文件导入每第 N 行

    c++ - 使用 Rcpp 在 Ubuntu Xenial 上抛出 std::runtime_error 时出现段错误

    r - 检查包含空向量的列表的 "emptiness"(R 不识别为空列表)

    python - 如何从 pandas 数据框中选择相同的行以及 null

    r - 将 d3heatmap 的图像保存在文件中

    r - 仅在 R Markdown 中使用 ggplot2 时出现 "Faceting variables must have at least one value"错误;这是什么意思?

    java - 关于不可变列表(由 Arrays.asList() 创建)