R计算n行

时间:2016-04-27 12:39:20

标签: r

例如,我有一个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

4 个答案:

答案 0 :(得分:4)

以下是您可能会发现有用的几个选项:

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行计算A个数并返回一个列表:

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

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

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

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

答案 1 :(得分: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)

答案 2 :(得分:1)

我们可以使用data.table

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

答案 3 :(得分:0)

如果您更喜欢dplyr,则可以使用

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

请注意,此方法不包含某个组没有值的级别(即没有0​​值)