我有一个包含多行的文件,如下所示
在file1中:
a 8|2|3|4 4
b 2|3|5|6|7 5
c 8|5|6|7|9 5
a到a有4个重叠,类似a到b有2个重叠,所以为了检查各个实体之间的重叠,我需要生成一个带有上述细节的矩阵,输出应该是一个矩阵,如
a b c
a 4 2 1
b 2 5 3
c 1 3 5
请给我一个建议,怎么做?有没有办法使用excel或使用shell脚本或使用R?我写了下面的代码,但由于我不是一个好的编码器,我无法以正确的格式打印输出。
setwd('C:\\Users\\Desktop\\')
newmet1<-file("file.txt")
newmet2<-strsplit(readLines(newmet1),"\t")
Newmet<-sapply(newmet2, function(x) x[2:length(x)], simplify=F )
for (i in 1:length(Newmet))
{
for (j in 1:length(Newmet)
{
c <- ((intersect(Newmet[[i]], Newmet[[j]]))
print (length(c))
}
}
编辑:感谢您的所有答案..我使用excel和R得到了矩阵,并提供了以下答案。
答案 0 :(得分:2)
这是R中的一个函数,它返回每列匹配的计数作为新矩阵
首先,我们将您的数据导入R data.frame对象:
A <- c(8,2,3,4,NA)
B <- c(2,3,5,6,7)
C <- c(8,5,6,7,9)
dataset <- data.frame(A,B,C)
然后我们创建一个函数:
count_matches <- function (x) {
if (is.data.frame(x)) {
y <- NULL
for (i in 1:dim(x)[2]) {
for (j in 1:dim(x)[2]) {
count <- sum(x[[i]][!is.na(x[i])] %in% x[[j]][!is.na(x[j])])
y <- c(y, count)
}
}
y <- matrix(y, dim(x)[2], )
colnames(y) <- names(x)
rownames(y) <- names(x)
return(y)
} else {
print('Argument must be a data.frame')
}
}
我们在数据集上测试函数:
count_matches(dat)
返回矩阵:
A B C
A 4 2 1
B 2 5 3
C 1 3 5
答案 1 :(得分:1)
如果数字位于Sheet1!A1开始的单独单元格中,请尝试
=SUM(--ISNUMBER(MATCH(Sheet1!$A1:$E1,INDEX(Sheet1!$A$1:$E$3,COLUMN(),0),0)))
从Sheet2开始!A1。
必须使用 Ctrl Shift 输入
作为数组公式输入替代公式,不必从Sheet2开始!A1
SUM(--ISNUMBER(MATCH(Sheet1!$A1:$E1,INDEX(Sheet1!$A$1:$E$3,COLUMNS($A:A),0),0)))
答案 2 :(得分:1)
使用R:
# dummy data
df1 <- read.table(text = "a 8|2|3|4 4
b 2|3|5|6|7 5
c 8|5|6|7|9 5", as.is = TRUE)
df1
# V1 V2 V3
# 1 a 8|2|3|4 4
# 2 b 2|3|5|6|7 5
# 3 c 8|5|6|7|9 5
# convert 2nd column to a splitted list
myList <- unlist(lapply(df1$V2, strsplit, split = "|", fixed = TRUE), recursive = FALSE)
names(myList) <- df1$V1
myList
# $a
# [1] "8" "2" "3" "4"
# $b
# [1] "2" "3" "5" "6" "7"
# $c
# [1] "8" "5" "6" "7" "9"
# get overlap counts
crossprod(table(stack(myList)))
# ind
# ind a b c
# a 4 2 1
# b 2 5 3
# c 1 3 5
如果我们删除数据处理位,则已提供此答案 类似的帖子:Intersect all possible combinations of list elements