首页 > 解决方案 > 计算 R 数据框中的唯一行组合

问题描述

我有一个原始数据框,它在第一列中包含一个唯一值,后面有 X(没有最小值或最大值)行,其中包含与第一列中唯一值有关的值。我正在寻找第 2-inf 列中唯一值对的数量。对于每一行。数据看起来像下面的数据框,但规模更大。例如,“w”和“x”在同一行出现了 4 次(第 1、3、5、7 行),“y”和“z”在同一行出现了两次(1、6)。我想计算所有行的唯一对数。

      x$`Order ID` 1    2    3    4    5
    1            1 w    x    y    z <NA>
    2            2 x    y <NA> <NA> <NA>
    3            3 u    v    w    x    y
    4            4 w <NA> <NA> <NA> <NA>
    5            5 w    x    y <NA> <NA>
    6            6 y    z <NA> <NA> <NA>
    7            7 t    u    v    w    x

我试图首先使用 data.table 库中的 setDT() 来计算一般唯一行的数量,然后将其分解为行内的唯一值对,但得到一个错误,即行不相等(因为它们不相等)。我不太精通 R,但想知道可以使用什么函数来做到这一点。谢谢你。

编辑:我还尝试了 plyr 库中的 count() 函数。这是在正确的轨道上,但只计算整个唯一行,而不是行中的单个唯一对。

    library(plyr)
    count(transposed[, -1])

      X1   X2   X3   X4   X5 freq
    1  t    u    v    w    x    1
    2  u    v    w    x    y    1
    3  w    x    y    z <NA>    1
    4  w    x    y <NA> <NA>    1
    5  w <NA> <NA> <NA> <NA>    1
    6  x    y <NA> <NA> <NA>    1
    7  y    z <NA> <NA> <NA>    1

编辑2:

此数据子集的所需输出:

       Pair Frequency
    1    tu         1
    2    tv         1
    3    tw         1
    4    tx         1
    5    uv         2
    6    uw         2
    7    ux         2
    8    uy         1
    9    vw         2
    10   vx         2
    11   vy         1
    12   wx         4
    13   wy         3
    14   wz         1
    15   xy         4
    16   xz         1
    17   yz         2

计算每行中不同的 2 对组合的数量,然后计算这些组合在整个数据集中出现的次数。顺序无关紧要 (xy = yx)。

标签: rdataframecount

解决方案


尝试这个,

combs <- t(combn(sort(na.omit(unique(unlist(dat[,-1])))), 2))
head(combs, n=7)
#      [,1] [,2]
# [1,] "t"  "u" 
# [2,] "t"  "v" 
# [3,] "t"  "w" 
# [4,] "t"  "x" 
# [5,] "t"  "y" 
# [6,] "t"  "z" 
# [7,] "u"  "v" 
freqs <- apply(combs, 1, function(C) {
  sum(apply(dat[,-1], 1, function(a) all(C %in% a, na.rm = TRUE)))
})
combsDF <- as.data.frame(combs)
combsDF$freq <- freqs
combsDF
#    V1 V2 freq
# 1   t  u    1
# 2   t  v    1
# 3   t  w    1
# 4   t  x    1
# 5   t  y    0
# 6   t  z    0
# 7   u  v    2
# 8   u  w    2
# 9   u  x    2
# 10  u  y    1
# 11  u  z    0
# 12  v  w    2
# 13  v  x    2
# 14  v  y    1
# 15  v  z    0
# 16  w  x    4
# 17  w  y    3
# 18  w  z    1
# 19  x  y    4
# 20  x  z    1
# 21  y  z    2

如果您只想要具有正匹配的行,那么

combsDF[ combsDF$freq > 0, ]
#    V1 V2 freq
# 1   t  u    1
# 2   t  v    1
# 3   t  w    1
# 4   t  x    1
# 7   u  v    2
# 8   u  w    2
# 9   u  x    2
# 10  u  y    1
# 12  v  w    2
# 13  v  x    2
# 14  v  y    1
# 16  w  x    4
# 17  w  y    3
# 18  w  z    1
# 19  x  y    4
# 20  x  z    1
# 21  y  z    2

这很可能很容易扩展到包括不仅仅是“2”组合。


推荐阅读