【问题标题】:Overlap matrix in RR中的重叠矩阵
【发布时间】:2012-07-31 18:50:24
【问题描述】:

我有以下数据框

id channel
1  a
1  b
1  c
2  a
2  c
3  a

我想创建和重叠矩阵。它基本上是一个方阵,其中行和列标签为 a、b、c,该表中的每个条目显示每个通道共有多少个 id。例如在上面的例子中,矩阵看起来像

  a b c
a 3 1 2
b 1 1 1
c 2 1 2

非常感谢。

【问题讨论】:

    标签: r


    【解决方案1】:

    这应该可以解决问题:

    df <- data.frame(id=c(1,1,1,2,2,3), channel=letters[c(1,2,3,1,3,1)]) # your data
    
    m <- table(df[[1]], df[[2]])   ## Alternatively:  m <- do.call(table, df)
    t(m) %*% m
    #   a b c
    # a 3 1 2
    # b 1 1 1
    # c 2 1 2
    

    【讨论】:

    • 比@Julius 更喜欢这个。我的数据框非常大,过去 plyr 的 ddply 运行速度至少比基本应用慢一个数量级。但朱利叶斯给出了一个很好的解释。非常感谢你们两个。
    【解决方案2】:
    library(plyr)
    df
      id channel
    1  1       a
    2  1       b
    3  1       c
    4  2       a
    5  2       c
    6  3       a
    tb <- table(ddply(df, .(id), function(x) {x$id <- x$channel; expand.grid(x)}))
    tb
       channel
    id  a b c
      a 3 1 2
      b 1 1 1
      c 2 1 2
    names(dimnames(tb)) <- NULL
    tb
      a b c
    a 3 1 2
    b 1 1 1
    c 2 1 2
    

    现在对作为table() 输出的矩阵表进行一些解释和一些事情。 ?table中有一个例子

    a <- letters[1:3]
    (b <- sample(a))
    [1] "b" "c" "a"
    table(a, b)
       b
    a   a b c
      a 0 1 0
      b 0 0 1
      c 1 0 0
    

    所以它通过位置匹配元素.. 现在如果我们有

      id channel
      1       a
      1       b
      1       c
      2       a
      ...
    

    然后共享相同的id 可以通过将数据框按id 拆分,创建channel 列的副本并获取这两列的所有组合来显示:

    tbl <- expand.grid(data.frame(x = c("a","b","c"), y = c("a", "b", "c")))
    tbl
      x y
    1 a a
    2 b a
    3 c a
    4 a b
    5 b b
    6 c b
    7 a c
    8 b c
    9 c c
    table(tbl$x, tbl$y)
    
        a b c
      a 1 1 1
      b 1 1 1
      c 1 1 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 2018-10-19
      • 1970-01-01
      • 2014-11-22
      • 2020-01-05
      • 1970-01-01
      相关资源
      最近更新 更多