R 如何在多个数据帧中查找列的位置
我有许多数据帧,与下面创建的4个数据帧类似:-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)) 上面的输出显示,在
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,我已经根据要求添加了更多的解释。