我有许多数据框类似于下面创建的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中许多文件中每列的位置。
答案 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()
函数附加位置。最后,计算出Colnames
和Location
的出现次数。
请注意,这也适用于具有不同列数的data.frames列表。
data.table
包中包含melt()
data.table
个data.frame
对象的优化方法。对于array
,list
和reshape2
个对象,将调度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
})
]
}
。