【问题标题】:cross table a few columns in R [duplicate]交叉表R中的几列[重复]
【发布时间】:2020-07-24 22:00:44
【问题描述】:

假设我有一个如下所示的数据框。也就是说,每个人都有多个诊断(dx)。

person dx1  dx2 dx3 dx4
A  Y  Y  N  N  
B  N  N  Y  Y 
C  Y  Y  N  Y
...

现在,对于上述每个 dx,我如何生成如下表格,以输出每个可能的 dx 组合的计数。以下计数是出于演示目的。例如,对于第一行记录,这意味着 2 人拥有 dx1(但没有其他),1 人同时拥有 dx1 和 dx2。

N    dx1 dx2 dx3 dx4
dx1   2   1   0   0
dx2   0   1   1   0
dx3   1   2   1   1
dx4   0   0   1   0

非常感谢您的帮助!

最好的问候, 杰

【问题讨论】:

  • 那么您的示例数据的预期输出如何?你提供的那个?第三人三项怎么算?

标签: r


【解决方案1】:

也许你可以试试crossprod

> crossprod(df[-1]=="Y")
    dx1 dx2 dx3 dx4
dx1   2   2   0   1
dx2   2   2   0   1
dx3   0   0   1   1
dx4   1   1   1   2

【讨论】:

    【解决方案2】:

    我认为你可以通过outer 做到这一点:

    cols <- names(df)[-1]
    apply_fun <- function(x, y) sum(df[, x] == 'Y' & df[, y] == 'Y')
    mat <- outer(cols, cols, Vectorize(apply_fun))
    dimnames(mat) <- list(cols, cols)
    mat
    
    #    dx1 dx2 dx3 dx4
    #dx1   2   2   0   1
    #dx2   2   2   0   1
    #dx3   0   0   1   1
    #dx4   1   1   1   2
    

    数据

    df <- structure(list(person = c("A", "B", "C"), dx1 = c("Y", "N", "Y"
    ), dx2 = c("Y", "N", "Y"), dx3 = c("N", "Y", "N"), dx4 = c("N", 
    "Y", "Y")), class = "data.frame", row.names = c(NA, -3L))
    

    【讨论】:

      猜你喜欢
      • 2016-01-01
      • 1970-01-01
      • 2021-06-20
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多