簡體   English   中英

計數兩行 dataframe R 之間的匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM