Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 列表上的交集_R - Fatal编程技术网

R 列表上的交集

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

我有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
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的具体输出吗?我已经编写了您的文件格式的结果,或者您是否有一种读取文件的方法,以便您可以更容易地判断哪些信息来自哪个文件?