我想使用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]
答案 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天的范围。然后我们按ID
和Day_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
,我们会计算ID
与X-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天。