代码之家  ›  专栏  ›  技术社区  ›  Cina

计算行中的元素并映射到r中的列

  •  0
  • Cina  · 技术社区  · 6 年前

    我想通过计算实体来总结我的数据,并为每个实体创建计数列。 比如说: 测向:

    id   class
    1     A
    1     B
    1     A
    1     A
    1     B
    1     c
    2     A
    2     B
    2     B
    2     D
    

    id  A  B  C  D
    1   3  2  1  0
    2   1  2  0  1
    

    在R中如何使用 应用 功能?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Zheyuan Li    6 年前
    df <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), 
    class = structure(c(1L, 2L, 1L, 1L, 2L, 3L, 1L, 2L, 2L, 4L
    ), .Label = c("A", "B", "C", "D"), class = "factor")), .Names = c("id", 
    "class"), class = "data.frame", row.names = c(NA, -10L))
    
    with(df, table(id, class))
    #   class
    #id  A B C D
    #  1 3 2 1 0
    #  2 1 2 0 1
    
    xtabs(~ id + class, df)
    #   class
    #id  A B C D
    #  1 3 2 1 0
    #  2 1 2 0 1
    
    tapply(rep(1, nrow(df)), df, length, default = 0)
    #   class
    #id  A B C D
    #  1 3 2 1 0
    #  2 1 2 0 1
    
        2
  •  1
  •   G. Grothendieck    6 年前

    这似乎是一个非常奇怪的要求,但如果你坚持使用 apply 然后是函数 count id 等于 x class 等于 y 身份证件 得到 a 使用嵌套 应用

    uid <- unique(DF$id)
    uclass <- unique(DF$class)
    
    count <- function(x, y, DF) sum(x == DF$id & y == DF$class)
    a <- apply(matrix(uclass), 1, function(u) apply(matrix(uid), 1, count, u, DF))
    dimnames(a) <- list(uid, uclass)
    

    > a
      A B c D
    1 3 2 1 0
    2 1 2 0 1
    

    注意

    我们用这个 DF

    Lines <- "id   class
    1     A
    1     B
    1     A
    1     A
    1     B
    1     c
    2     A
    2     B
    2     B
    2     D"
    DF <- read.table(text = Lines, header = TRUE)