【问题标题】:Counting the elements in rows and map to column in r计算行中的元素并映射到r中的列
【发布时间】:2018-10-02 00:26:19
【问题描述】:

我想通过计算实体来总结我的数据并为每个实体创建counting_column。 让我们说: df:

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 中使用 apply 函数做到这一点?

【问题讨论】:

    标签: r apply


    【解决方案1】:
    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】:

      这似乎是一个非常奇怪的要求,但如果你坚持使用apply,那么函数count 会计算id 等于xclass 等于y 的行数。它适用于idclass 的每个组合,以使用嵌套的apply 调用获得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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-23
        • 2017-10-31
        • 2019-08-09
        • 1970-01-01
        • 1970-01-01
        • 2023-01-19
        • 2021-11-11
        • 1970-01-01
        相关资源
        最近更新 更多