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

R 如何在多个数据帧中查找列的位置,r,dplyr,data.table,plyr,sqldf,R,Dplyr,Data.table,Plyr,Sqldf,我有许多数据帧,与下面创建的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)) 上面的输出显示,在

我有许多数据帧,与下面创建的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))
上面的输出显示,在所有4个数据帧中,A是第一列的标签,而B是2个数据帧中2列的标签


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

您可以尝试以下黑客解决方案:

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")]
library(data.table)
setDT(melt(lapply(list(red, blue, green, pink), names), value.name = "Colnames"))[
  , Location := rowid(L1)][, .N, keyby = .(Colnames, Location)]
foo不使用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)
库(tidyverse)
f%
地图(f)%>%
分组依据(位置、列名称)%>%
汇总(Freq=n())%>%
安排(地点、频率)
输出:

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
A tible:5 x 3
分组:地点[3]
位置名称频率
1 a 4
2b2
3 2 d 2
4 3 b 2
5 3 d 2

为了完整起见,并对问题进行了相应的标记,以下是
数据。表
解决方案:

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")]
library(data.table)
setDT(melt(lapply(list(red, blue, green, pink), names), value.name = "Colnames"))[
  , Location := rowid(L1)][, .N, keyby = .(Colnames, Location)]
它使用
melt()
将调用
lappy()
返回的列名重塑为长格式的data.frame。与data.table合并后,使用
rowid()
函数追加位置。最后,计算
Colnames
Location
的出现次数

请注意,这也适用于列数不同的data.frames列表

data.table
包包括一个针对
data.table
对象的
melt()
优化方法。对于
data.frame
array
list
对象,将调度
restrape2
包中的相应方法


value.name
参数指定数据值列的名称。根据OP的要求,默认名称
将替换为
Colnames
。有关详细信息,请参阅帮助页面
?melt

有没有一种不用rbind的方法呢?我不想要rbind,因为我所有的文件都没有相同的列数。sapply并没有给我想要的输出。不管我给了什么,代码都应该是万无一失的@PoGibas。tidyr是tidyverse包系统的一部分。不过,这个特殊的解决方案主要使用purrr和dplyr函数。value.name的作用是什么?@sidsatam,我已经根据要求添加了更多的解释。