所以我试图找出大约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。此外,如果有任何方法可以显示哪些是不匹配的列名称,那么这将是一个额外的奖励。
答案 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 的集群:很难说在更大的情况下哪个组是 TRUE
或 FALSE
,但您可以按每个数据中存在的列集对它们进行分组。框架并查看这些组的大小:
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 组包含 DF1
和 DF2
,是最大的组。