【问题标题】:Use lapply to find if column names of various dataframes are the same使用 lapply 查找各种数据框的列名是否相同
【发布时间】:2017-11-22 20:03:50
【问题描述】:

我试图找出大约 20 个数据框中的列名是否相同。 20 个数据帧保存在一个列表中 (Portfolio_snapshots)。这是一组样本数据:

DF1 <- data.frame(v1=rnorm(10),v2=LETTERS[1:5])
DF2 <- data.frame(v1=rnorm(10),v2=LETTERS[1:5])
DF3 <- data.frame(v1=rnorm(10),v3=LETTERS[1:5])
Portfolio_snapshots <- list(DF1,DF2,DF3)

我试过这个:

Df_names <- lapply(Portfolio_snapshots, function(x) {
        names(as.data.table(x))})
lapply(Df_names,function(x) {all.equal((Df_names[1]),(x))})

但它不会产生正确的结果。理想情况下,代码应该为前两个生成TRUE,为第三个生成FALSE。此外,如果有任何方法可以显示不匹配的列名,那么这将是一个额外的好处。

【问题讨论】:

  • 你的问题可能是?
  • 如果您只想要 TRUE/FALSE 答案,请尝试用 isTRUE 包裹 all.equal
  • 我试过这个 lapply(Df_names,function(x) {isTRUE(all.equal((Df_names[1]),(x)))}) 但是,它显示了所有 20 个比较的 FALSE ,而至少第一个应该是 TRUE,因为它将 Df_names[1] 与自身进行比较。
  • 你没有得到一个好的答案,因为你没有给我们一个简单的可重复的例子
  • 你可以在setdiff(names(df1),names(df2),names(df3))中使用setdiff

标签: r list data.table lapply


【解决方案1】:

可能有一种更优雅的方式,但这可行:

apply(do.call(rbind,lapply(Portfolio_snapshots,colnames)),2,function(x) length(unique(x)) &gt; 1)

这基本上为每个数据框和列创建了一个名称向量,并查看是否有多个唯一名称。 它将为每一列返回一个布尔值,如果名称不同,则返回 TRUE,如果名称相同,则返回 FALSE

【讨论】:

    【解决方案2】:

    我发现 Reduce(intersect,Df_names) 是解决问题的好方法

    【讨论】:

      【解决方案3】:

      此比较显示哪些变量不匹配:

      library(janitor)
      x <- compare_df_cols(DF1, DF2, DF3)
      x
      
        column_name       DF1       DF2       DF3
      1          v1   numeric   numeric   numeric
      2          v2 character character      <NA>
      3          v3      <NA>      <NA> character
      

      至于标记 data.frames 的集群:很难说在更大的情况下哪个组是 TRUEFALSE,但您可以按每个 data.frame 中存在的列集对它们进行分组并查看这些组的大小:

      library(tidyverse)
      x %>%
        select(-column_name) %>%
        t() %>%
        as_tibble(rownames = "df") %>%
        pivot_longer(V1:V3) %>%
        group_by(df) %>%
        summarise(var_types = paste(value, collapse = ", ")) %>%
        group_by(var_types) %>%
        mutate(group_id = cur_group_id(),
               group_size = n())
      
      # A tibble: 3 x 4
      # Groups:   var_types [2]
        df    var_types              group_id group_size
        <chr> <chr>                     <int>      <int>
      1 DF1   numeric, character, NA        1          2
      2 DF2   numeric, character, NA        1          2
      3 DF3   numeric, NA, character        2          1
      

      包含DF1DF2 的组#1 是最大的。

      【讨论】:

        猜你喜欢
        • 2011-10-26
        • 2019-09-30
        • 1970-01-01
        • 1970-01-01
        • 2016-02-07
        • 1970-01-01
        • 2019-04-15
        • 2017-08-14
        • 2022-01-14
        相关资源
        最近更新 更多