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

时间:2017-11-30 09:27:45

标签: 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))

我想要的输出如下所示

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中许多文件中每列的位置。

3 个答案:

答案 0 :(得分:3)

你可以试试这个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")]

答案 1 :(得分:2)

不使用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

答案 2 :(得分: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()返回的列名称为long格式的data.frame。在对data.table进行coersion之后,使用rowid()函数附加位置。最后,计算出ColnamesLocation的出现次数。

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

data.table包中包含melt() data.tabledata.frame对象的优化方法。对于arraylistreshape2个对象,将调度value.name包中的相应方法。

value参数指定熔融数据值列的名称。根据OP的要求,默认名称Colnames将替换为?melt。有关详细信息,请参阅帮助页面let TEST = true; // assume this is passed in somehow, perhaps via cli arguments module.exports = { entry: { entry: 'entry.js' }, output: { filename: TEST ? '[name].test.bundle.js' : '[name].bundle.js' path: __dirname + '/output' }, module: { rules: [{ test: /\.js$/, use: { loader: 'babel-loader' } }] }, plugins: [ new webpack.DefinePlugin({ TEST: JSON.stringify(TEST) // variable, will be consistent with filename }) ] }