使用R

时间:2016-10-24 19:30:27

标签: r count

我想使用R中的条件计算每组内的观察数量。

例如,我想计算每10天ID“A”的观察次数。

ID (A,A,A,A,A,A,A,A)
Day (7,14,17,25,35,37,42,57)
X (9,20,14,24,23,30,20,40)

输出图像 (在前10天,我们对ID“A”有一个观察。天数:7  在接下来的10天里,我们对ID“A”有两个观察结果。天:14,17)

ID (A,A,A,A,A,A,A,A)
Day_10 (1,2,3,4,5,6)
Count_10 (1,2,1,2,1,1)

如果我可以计算某些值之前和之后的观察数量,那也很好。对于给定的X值,我想知道ID“A”中[X-10,X + 10]之间的观察次数。

输出图像如下:

ID (A,A,A,A,A,A,A,A)
X (9,20,14,24,23,30,40,50)
Count_X10 (3,3,3,3,3,3,2,1)

Count_X10:对于给定的X(= 9),ID“A”中有三个观察值[-1,19]

2 个答案:

答案 0 :(得分:0)

以下是作为data.frame加载的数据,以保持观察连接。请注意,我添加了第二个组来展示如何处理

df <-
  data.frame(
    ID = rep(c("A","B"), each = 8)
    , Day = c(7,14,17,25,35,37,42,57)
    , X = c(9,20,14,24,23,30,20,40)
  )

然后,我使用dplyr通过一系列步骤传递数据。首先,我按ID列拆分,然后使用lapply在每个ID组上运行一个函数,包括计算两列感兴趣的列(然后返回整个data.frame) 。最后,我将行与bind_rows

拼接在一起
df %>%
  split(.$ID) %>%
  lapply(function(x){
    x$nextTen <- sapply(x$Day, function(thisDay){
      sum(between(x$Day, thisDay, thisDay + 10))
    })

    x$plusMinusTen <- sapply(x$Day, function(thisDay){
      sum(between(x$Day, thisDay - 10, thisDay + 10))
    })

    return(x)
  }) %>%
  bind_rows()

结果是

   ID Day  X nextTen plusMinusTen
1   A   7  9       3            3
2   A  14 20       2            3
3   A  17 14       2            4
4   A  25 24       2            3
5   A  35 23       3            4
6   A  37 30       2            3
7   A  42 20       1            3
8   A  57 40       1            1
9   B   7  9       3            3
10  B  14 20       2            3
11  B  17 14       2            4
12  B  25 24       2            3
13  B  35 23       3            4
14  B  37 30       2            3
15  B  42 20       1            3
16  B  57 40       1            1

但是您感兴趣的任何条件都可以添加到lapply步骤。

答案 1 :(得分:0)

您的样本数据:

df = data.frame(
  ID = rep('A', 8),
  Day = c(7, 14, 17, 25, 35, 37, 42, 57),
  X = c(9, 20, 14, 24, 23, 30, 40, 50),
  stringsAsFactors = FALSE)

注意:您为向量X提供了两个不同的值。我想它是c(9, 20, 14, 24, 23, 30, 40, 50),而不是c(9, 20, 14, 24, 23, 30, 20, 40)

首先计算:

library(dplyr)

output1 = df %>% 
  mutate(Day_10 = ceiling(Day/10)) %>%
  group_by(ID, Day_10) %>%
  summarise(Count_10 = n())

mutate步骤通过舍入Day/10来创建10天的范围。然后我们按IDDay_10进行分组,并计算每组内的观察数量。

> output1
     ID Day_10 Count_10
  <chr>  <dbl>    <int>
1     A      1        1
2     A      2        2
3     A      3        1
4     A      4        2
5     A      5        1
6     A      6        1

第二次计算:

output2 = df %>%
  group_by(ID) %>%
  mutate(Count_X10 = sapply(X, function(x){sum(Day >= x-10 & Day <= x+10)})) %>%
  select(-Day)

我们按ID进行分组,对于每个X,我们会计算IDX-10之间的X+10天数。

> output2
     ID     X Count_X10
  <chr> <dbl>     <int>
1     A     9         3
2     A    20         3
3     A    14         3
4     A    24         3
5     A    23         3
6     A    30         3
7     A    40         3
8     A    50         2

注意:我想你给出的所需输出有一个错误,例如,当X = 50时,[40,60]中有2个观察{{1} }“A”:第42天和第57天。