如何在多个数据框中查找列的位置

How to find the location of a column in multiple dataframes

我有很多数据框类似于下面创建的 4 个数据框:-

red<-data.frame(a=c(1,2,3),b=c(1,4,5),d=c(1,2,3))
blue<-data.frame(a=c(1,2,3),d=c(1,2,3),b=c(1,4,5))
green<-data.frame(a=c(1,2,3),b=c(1,4,5),d=c(1,2,3))
pink<-data.frame(a=c(1,2,3),d=c(1,2,3),b=c(1,4,5))

我想要的输出如下所示

Location  |Freq/Count|Colnames

    1     |     4    |    A

    2     |     2    |    B

    3     |     2    |    B

    2     |     2    |    D

    3     |     2    |    D

以上输出显示,在所有4个数据框中,A是第一列的标签,而B仅在2个数据框中是2列的标签。

我想在 R 中为许多具有相同列的文件生成此输出。我想知道 R 中许多文件中每一列的位置。

您可以尝试这个 hacky 解决方案:

foo <- do.call(rbind, 
               lapply(list(red, pink, blue, green), names))
#      [,1] [,2] [,3]
# [1,] "a"  "b"  "d" 
# [2,] "a"  "d"  "b" 
# [3,] "a"  "d"  "b" 
# [4,] "a"  "b"  "d" 

result <- reshape2::melt(apply(foo, 2, table))
# Var1 value L1
#   a     4  1
#   b     2  2
#   d     2  2
#   b     2  3
#   d     2  3

# To get wanted result 
colnames(result) <- c("Colnames", "Freq", "Location")
result[order(result$Colnames), c("Location", "Freq", "Colnames")]

没有使用 rbind:

library(tidyverse)

f <- function(x) {
  tibble(Colnames = names(x), Location = seq(Colnames))
}

list(red, blue, green, pink) %>%
  map_df(f) %>%
  group_by(Location, Colnames) %>%
  summarize(Freq = n()) %>%
  arrange(Location, Freq)

输出:

A tibble: 5 x 3
Groups:   Location [3]
  Location Colnames  Freq
     <int>    <chr> <int>
1        1        a     4
2        2        b     2
3        2        d     2
4        3        b     2
5        3        d     2

为了完整起见,并且由于问题已被相应标记,这里有一个 data.table 解决方案:

library(data.table)
setDT(melt(lapply(list(red, blue, green, pink), names), value.name = "Colnames"))[
  , Location := rowid(L1)][, .N, keyby = .(Colnames, Location)]
   Colnames Location N
1:        a        1 4
2:        b        2 2
3:        b        3 2
4:        d        2 2
5:        d        3 2

它使用 melt() 将调用 lapply() 返回的列名列表重塑为长格式的 data.frame。在强制转换为 data.table 之后,使用 rowid() 函数附加位置。最后计算ColnamesLocation的出现次数。

请注意,这也适用于具有不同列数的 data.frame 列表。

data.table 程序包包含针对 data.table 对象的 melt() 优化方法。对于 data.framearraylist 对象,将调度 reshape2 包中的相应方法。

value.name 参数指定熔化数据值列的名称。根据 OP 的要求,默认名称 value 被替换为 Colnames。请参阅帮助页面 ?melt 了解更多详情。