[英]count matches between two rows of dataframe R
我有一個 dataframe 如下:
LA LE LI LO LU
A 1 0 0 0 0
B 0 0 1 1 1
C 0 0 0 0 0
D 1 0 0 0 0
E 1 0 1 1 0
我想計算兩行之間有多少值匹配,但不計算等於 0 作為匹配,只等於 1。 例如 ax = 1,BxE = 2,但在某種程度上,我將為 2 行的每個組合獲取這些值。 我在用着
df = read.table('rmatr.txt', header = TRUE, sep = "\t", row.names = 1)
閱讀我的文件
也許你可以combn
像下面一樣組合
cbind(
data.frame(t(combn(row.names(df), 2))),
cnt = combn(asplit(df, 1), 2, FUN = function(x) sum(do.call("*", x)))
)
這使
X1 X2 cnt
1 A B 0
2 A C 0
3 A D 1
4 A E 1
5 B C 0
6 B D 0
7 B E 2
8 C D 0
9 C E 0
10 D E 1
數據
> dput(df)
structure(list(LA = c(1L, 0L, 0L, 1L, 1L), LE = c(0L, 0L, 0L,
0L, 0L), LI = c(0L, 1L, 0L, 0L, 1L), LO = c(0L, 1L, 0L, 0L, 1L
), LU = c(0L, 1L, 0L, 0L, 0L)), class = "data.frame", row.names = c("A",
"B", "C", "D", "E"))
tmp=do.call(cbind,
sapply(1:(nrow(df)-1),function(i){
sapply((i+1):nrow(df),function(j){
c(i,j,sum(df[i,]==1 & df[j,]==1))
})
})
)
data.frame(
"Row1"=rownames(df)[tmp[1,]],
"Row2"=rownames(df)[tmp[2,]],
"cnt"=tmp[3,]
)
Row1 Row2 cnt
1 A B 0
2 A C 0
3 A D 1
4 A E 1
5 B C 0
6 B D 0
7 B E 2
8 C D 0
9 C E 0
10 D E 1
我們也可以使用來自base R
crossprod
crossprod
out <- as.data.frame.table(tcrossprod(as.matrix(df)))
out[1:2] <- t(apply(out[1:2], 1, sort))
subset(out, Var1 != Var2 & !duplicated(out[1:2]))
# Var1 Var2 Freq
#2 A B 0
#3 A C 0
#4 A D 1
#5 A E 1
#8 B C 0
#9 B D 0
#10 B E 2
#14 C D 0
#15 C E 0
#20 D E 1
df <- structure(list(LA = c(1L, 0L, 0L, 1L, 1L), LE = c(0L, 0L, 0L,
0L, 0L), LI = c(0L, 1L, 0L, 0L, 1L), LO = c(0L, 1L, 0L, 0L, 1L
), LU = c(0L, 1L, 0L, 0L, 0L)), class = "data.frame", row.names = c("A",
"B", "C", "D", "E"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.