R 对于不同级别的可变粒度,计算特定于类别的度量的有效方法是什么?

R 对于不同级别的可变粒度,计算特定于类别的度量的有效方法是什么?,r,R,为了使我的抽象问题更具体,我想计算每个年龄层特定疾病的特定阶层发病率。但我希望能够编写灵活的代码,以适应年龄分类中用户指定的各种粒度级别。例如,我可能对计算儿童发病率感兴趣以下内容可能会有所帮助。考虑新诊断病例的年龄。您可以在不同的休息时间“剪切”: age = sample(1:60, 100, replace=T) age [1] 57 50 52 18 18 15 48 36 5 45 25 44 23 60 36 27 43 41 23 10 41 40 58 5 55 29 2

为了使我的抽象问题更具体,我想计算每个年龄层特定疾病的特定阶层发病率。但我希望能够编写灵活的代码,以适应年龄分类中用户指定的各种粒度级别。例如,我可能对计算儿童发病率感兴趣以下内容可能会有所帮助。考虑新诊断病例的年龄。您可以在不同的休息时间“剪切”:

age = sample(1:60, 100, replace=T)
age
  [1] 57 50 52 18 18 15 48 36  5 45 25 44 23 60 36 27 43 41 23 10 41 40 58  5 55 29 21 41 16 15 40 55 52 15 53  3 13 57 37 49 33
 [42] 34 54 25 28  5 23 43 50 12  9 42 40 25 29 51 39 59  3 19 11 17 35  4 41 45 28 14  5 36 13 56 33  7 55  5 11 34 47 46 44 26
 [83] 56 55 13 59 57 60 37 51 47 40 39 28 33  4 28 43 20 24

table(cut(age, breaks=c(0,1,10,25,50,60)))

  (0,1]  (1,10] (10,25] (25,50] (50,60] 
      0      12      24      44      20 

barplot(table(cut(age, breaks=c(0,1,10,25,50,60))))

如果您提供了数据(或具有代表性的子集)并展示了您迄今为止的尝试,您的问题会更好。看见如果没有这一点,这就产生了很多假设

假设一个数据框,
df
,该数据框按年龄识别儿童,并针对5种疾病中的每种疾病识别该儿童是否患有该疾病。每一行是一个孩子,
df$age
是年龄,
df$Xn
如果孩子患有疾病Xn,则为1,否则为0。在这个例子中,我们以5%的比率使用1000000名儿童随机“分配”疾病。那么

set.seed(1)    # for reproducible example
children <- data.frame(age=sample(1:60,1e6, replace=T), 
                 matrix(sample(0:1,5e6, replace=T, p=c(0.95,0.05)),nc=5))

# you start here...
disease.rates <- function(data,breaks) {
  cuts      <- cut(data$age,breaks)
  get.rates <- function(df) sapply(df,function(col) sum(col==1)/length(col))
  rate      <- sapply(split(data[-1],cuts),get.rates)
  data.frame(t(rate))
}
# by year
disease.rates(children,breaks=c(0,12*1:5))
##              X1      X2      X3      X4      X5
## (0,12]  0.04927 0.05027 0.04916 0.05049 0.05074
## (12,24] 0.04965 0.04957 0.04970 0.05044 0.04982
## (24,36] 0.05032 0.05065 0.05044 0.05036 0.05024
## (36,48] 0.04962 0.05079 0.04984 0.04895 0.04981
## (48,60] 0.05103 0.05012 0.04922 0.04986 0.04942

# more detail in first year
disease.rates(children,breaks=c(0,1,2,4,6,12,60))
##              X1      X2      X3      X4      X5
## (0,1]   0.04780 0.04949 0.04846 0.04968 0.05198
## (1,2]   0.04891 0.04808 0.04909 0.05212 0.05236
## (2,4]   0.04943 0.04797 0.04740 0.05113 0.05110
## (4,6]   0.04980 0.05143 0.05004 0.05086 0.05189
## (6,12]  0.04935 0.05116 0.04959 0.05002 0.04977
## (12,60] 0.05016 0.05028 0.04980 0.04990 0.04982
set.seed(1)#用于可复制的示例

孩子们,我猜你们在找
?切
cut(1:10,c(-Inf,5,8,Inf))
目前我认为你的问题太笼统了,但是使用cut()的例子很多。我的首选是“Hmisc”包中的cut2,因为它的默认值与我对切割方式的首选值相匹配。它还有一个基于
分位数
的分组函数的紧凑实现。我经常惊讶于我学到的小R函数,它们让事情变得如此简单!这太棒了。谢谢@alexis_laz。为了澄清,我想我会将此函数指定给一个对象,然后使用该对象运行计算。然后,当我想更改切点时,我只需更改对象,然后重新运行代码?您能否在问题中添加一个示例,以显示您希望对每个年龄层执行的确切操作?如果您搜索
cut
findInterval
aggregate
tapply
split
-
lapply
相结合,您将找到大量的资料来指导您的工作。据我所知,也许您正在寻找类似于
x=sample(1:80,1e3,T)的东西;表(切割(x,c(-Inf,5,20,50,Inf));表(cut(x,c(-Inf,2,5,40,50,Inf))
?感谢您投入时间和精力来编写一个完整的示例。我刚刚开始学习R,所以我为这个模糊的问题和缺少数据样本而道歉。不过,谢谢你。
set.seed(1)    # for reproducible example
children <- data.frame(age=sample(1:60,1e6, replace=T), 
                 matrix(sample(0:1,5e6, replace=T, p=c(0.95,0.05)),nc=5))

# you start here...
disease.rates <- function(data,breaks) {
  cuts      <- cut(data$age,breaks)
  get.rates <- function(df) sapply(df,function(col) sum(col==1)/length(col))
  rate      <- sapply(split(data[-1],cuts),get.rates)
  data.frame(t(rate))
}
# by year
disease.rates(children,breaks=c(0,12*1:5))
##              X1      X2      X3      X4      X5
## (0,12]  0.04927 0.05027 0.04916 0.05049 0.05074
## (12,24] 0.04965 0.04957 0.04970 0.05044 0.04982
## (24,36] 0.05032 0.05065 0.05044 0.05036 0.05024
## (36,48] 0.04962 0.05079 0.04984 0.04895 0.04981
## (48,60] 0.05103 0.05012 0.04922 0.04986 0.04942

# more detail in first year
disease.rates(children,breaks=c(0,1,2,4,6,12,60))
##              X1      X2      X3      X4      X5
## (0,1]   0.04780 0.04949 0.04846 0.04968 0.05198
## (1,2]   0.04891 0.04808 0.04909 0.05212 0.05236
## (2,4]   0.04943 0.04797 0.04740 0.05113 0.05110
## (4,6]   0.04980 0.05143 0.05004 0.05086 0.05189
## (6,12]  0.04935 0.05116 0.04959 0.05002 0.04977
## (12,60] 0.05016 0.05028 0.04980 0.04990 0.04982