R 列表上的交集
我有6个txt文件分为两组A和T文件。 我想在R中导入所有这些文件,并将每个A文件与每个T文件相交,得到一个A与T之比的矩阵,如本例所示。我在考虑制作两个向量列表,并找到一种从它们开始计算这个矩阵的方法R 列表上的交集,r,R,我有6个txt文件分为两组A和T文件。 我想在R中导入所有这些文件,并将每个A文件与每个T文件相交,得到一个A与T之比的矩阵,如本例所示。我在考虑制作两个向量列表,并找到一种从它们开始计算这个矩阵的方法 A_1.txt tomato zucchini potato banana coconut salt A_2.txt tomato zucchini potato A_3.txt zucchini potato T_1.txt tomato zucchini potato banana coco
A_1.txt
tomato
zucchini
potato
banana
coconut
salt
A_2.txt
tomato
zucchini
potato
A_3.txt
zucchini
potato
T_1.txt
tomato
zucchini
potato
banana
coconut
salt
T_2.txt
tomato
zucchini
potato
banana
T_3.txt
potato
banana
coconut
我想得到的是这个矩阵:
T_1 T_2 T_3
A_1 6 4 3
A_2 3 3 1
A_3 2 2 1
有人能给我一个在R里怎么做的提示吗
我以这种方式阅读了这些信息:
A_files <- list.files("/home/A/", full.names = TRUE)
T_files <- list.files("/home/T/", full.names = TRUE)
myAlist <- lapply(A_files, read.delim, header=FALSE)
myTlist <- lapply(T_files, read.delim, header=FALSE)
这是我使用首选工具集所做的:
library(data.table)
library(magrittr)
filenames <- dir(pattern = "^[AT]_\\d.txt$")
vec <-
lapply(filenames, fread, header = FALSE) %>%
set_names(filenames %>% stringr::str_remove("\\.txt$")) %>%
rbindlist(idcol = "file")
vecA <- vec[file %like% "^A"]
vecT <- vec[file %like% "^T"]
vecA[vecT, on = .(V1), allow.cartesian = TRUE] %>%
dcast(file ~ i.file, length)
解释
假设所有文件A_1.txt、A_2.txt、…、T_2.txt、T_3.txt存储在同一文件夹中,则会选择文件名。
所有文件都被读入一个列表中,列表元素被相应地命名,然后它们被合并到一个data.table中,并带有一个额外的列来标识每行的源。
然后,在vecA和vecT中分离这两个数据集。这只是为了清楚起见,并使代码不那么复杂。
将这两个数据集连接起来,并根据公共元素的数量将结果从长格式改为宽格式。
联接的结果是
vecA[vecT, on = .(V1), allow.cartesian = TRUE]
可再现数据
这是一种从问题中提供的示例数据集创建6个输入文件的方法:
library(data.table)
library(magrittr)
fread("A_1.txt
tomato
zucchini
potato
banana
coconut
salt
A_2.txt
tomato
zucchini
potato
A_3.txt
zucchini
potato
T_1.txt
tomato
zucchini
potato
banana
coconut
salt
T_2.txt
tomato
zucchini
potato
banana
T_3.txt
potato
banana
coconut", header = FALSE) %>%
.[, fwrite(.(V1[-1]), V1[1]), by = cumsum(V1 %like% "^[AT]_\\d.txt$")]
下面是一种使用基本R命令的方法。R默认为从字符向量创建因子。重要的是你不允许这样做。在read.csv命令中包含参数as.is=TRUE将保留字符数据。首先,使数据易于获取:
myAlist <- list(A_1 = c("tomato", "zucchini", "potato", "banana", "coconut",
"salt"), A_2 = c("tomato", "zucchini", "potato"), A_3 = c("zucchini",
"potato"))
myTlist <- list(T_1 = c("tomato", "zucchini", "potato", "banana", "coconut",
"salt"), T_2 = c("tomato", "zucchini", "potato", "banana"), T_3 = c("potato",
"banana", "coconut"))
现在,我们创建一个函数来查找两个组的交集并计算共享项的数量:
Shared <- function(a, t) {
length(intersect(myAlist[[a]], myTlist[[t]]))
}
nshare <- mapply(Shared, A, T)
myTbl <- matrix(nshare, 3, byrow=TRUE, dimnames=list(A=names(myAlist), T=names(myTlist)))
myTbl
# T
# A T_1 T_2 T_3
# A_1 6 4 3
# A_2 3 3 1
# A_3 2 2 1
我们将A中的各组与B中的各组进行比较,例如A1与B1、B2、B3等:
(A <- rep(1:3, each=3))
# [1] 1 1 1 2 2 2 3 3 3
(T <- rep(1:3, 3))
# [1] 1 2 3 1 2 3 1 2 3
最后,我们计算共享项目的数量:
Shared <- function(a, t) {
length(intersect(myAlist[[a]], myTlist[[t]]))
}
nshare <- mapply(Shared, A, T)
myTbl <- matrix(nshare, 3, byrow=TRUE, dimnames=list(A=names(myAlist), T=names(myTlist)))
myTbl
# T
# A T_1 T_2 T_3
# A_1 6 4 3
# A_2 3 3 1
# A_3 2 2 1
我不确定我是否理解你想要得到什么。那些是文本文件,你怎么能做一个比例呢?或者你只是想把它们表示成一个比率,比如香蕉/土豆对不起,我已经修改了我的问题。根据你的数据,结果是什么?您可以添加示例dats的具体输出吗?我已经编写了您的文件格式的结果,或者您是否有一种读取文件的方法,以便您可以更容易地判断哪些信息来自哪个文件?