lapply查找各种数据帧的列名是否相同

时间:2017-06-20 10:19:06

标签: r list data.table lapply

所以我试图找出大约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。此外,如果有任何方法可以显示哪些是不匹配的列名称,那么这将是一个额外的奖励。

3 个答案:

答案 0 :(得分:0)

可能有更优雅的方式,但这有效:

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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,但您可以按每个数据中存在的列集对它们进行分组。框架并查看这些组的大小:

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

第 1 组包含 DF1DF2,是最大的组。

相关问题