【问题标题】:R Count number of times a level occurs in n rowsR 计数一个级别在 n 行中出现的次数
【发布时间】:2016-08-21 18:24:27
【问题描述】:

例如,我有一个具有 1000 个 obs 和 3 个级别(A、B、C)的向量。我想计算每 5 行出现 A 级的次数,并生成另一个计数值向量,即 200obs。有人能帮忙吗?我发现了如何根据另一个变量而不是行数来计算。谢谢!

df <- data.frame(test=factor(sample(c("A","B", "C" ),1000,replace=TRUE)))
head(df, 10)
   test
1     A
2     A
3     B
4     C
5     B
6     A
7     C
8     B
9     C
10    C

【问题讨论】:

标签: r


【解决方案1】:

如果你更喜欢dplyr,你可以使用

  c1 <- df %>%
  mutate(group = rep(paste0("G", seq(1, 200)), each = 5)) %>%
  # count each level
  count(group, test)

请注意,此方法不包括特定组没有值的级别(即没有 0 值)

【讨论】:

    【解决方案2】:

    这是dplyrtidyr 的解决方案

    library(dplyr)
    library(tidyr)
    df %>%
      mutate(Set = (seq_along(test) - 1) %/% 5) %>%
      group_by(Set, test) %>%
      summarise(N = n()) %>%
      spread(key = test, value = N, fill = 0)
    

    【讨论】:

      【解决方案3】:

      这里有几个你可能会觉得有用的选项:

      a) 计算每 5 行的所有条目并返回一个列表:

      head(lapply(split(df$test, rep(1:200, each = 5)), table), 2)
      # $`1`      # <- result for rows 1:5
      # 
      # A B C 
      # 1 0 4 
      # 
      # $`2`      # <- result for rows 6:10
      # 
      # A B C 
      # 3 0 2 
      

      b) 计算每 5 行的所有条目并返回一个矩阵:

      head(t(sapply(split(df$test, rep(1:200, each = 5)), table)), 2)
      #   A B C
      # 1 1 0 4
      # 2 3 0 2
      

      c) 每 5 行计算 As 的数量并返回一个列表:

      head(lapply(split(df$test == "A", rep(1:200, each = 5)), sum), 2)
      # $`1`
      # [1] 1
      # 
      # $`2`
      # [1] 3
      

      d) 每 5 行计算 As 的数量并返回一个向量:

      head(sapply(split(df$test == "A", rep(1:200, each = 5)), sum), 2)
      #1 2 
      #1 3 
      

      每个结果将有 200 个条目长/有 200 行。

      【讨论】:

      • 你也可以使用 ((seq_len(nrow(df)) -1) %/% 5) +1 代替 rep(1:200, each = 5)
      • splitting 的替代品可以是 table(rep(seq_len(nrow(df) / 5), each = 5), df$test)
      【解决方案4】:

      我们可以使用data.table

      library(data.table)
      setDT(df)[, .N , .(grp= gl(nrow(df), 5, nrow(df)), test)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-05
        • 2023-03-16
        • 1970-01-01
        • 2021-12-29
        • 1970-01-01
        相关资源
        最近更新 更多