如何在多个数据框中查找列的位置
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()
函数附加位置。最后计算Colnames
和Location
的出现次数。
请注意,这也适用于具有不同列数的 data.frame 列表。
data.table
程序包包含针对 data.table
对象的 melt()
优化方法。对于 data.frame
、array
和 list
对象,将调度 reshape2
包中的相应方法。
value.name
参数指定熔化数据值列的名称。根据 OP 的要求,默认名称 value
被替换为 Colnames
。请参阅帮助页面 ?melt
了解更多详情。
我有很多数据框类似于下面创建的 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()
函数附加位置。最后计算Colnames
和Location
的出现次数。
请注意,这也适用于具有不同列数的 data.frame 列表。
data.table
程序包包含针对 data.table
对象的 melt()
优化方法。对于 data.frame
、array
和 list
对象,将调度 reshape2
包中的相应方法。
value.name
参数指定熔化数据值列的名称。根据 OP 的要求,默认名称 value
被替换为 Colnames
。请参阅帮助页面 ?melt
了解更多详情。