我正在尝试学习如何在 R 中编写函数,我对表的使用以及如何处理“级别变量”有一个非常具体的问题。
我最初的问题是写一个累积危险函数。我的功能基本上是这样的:
示例:数据x= c(1,1,2,2,2,3,14,25)
,其中有8次观察/次
从矢量8观察到F(14)= 2/8 + 3/6 + 1/3 + 1/2的以下操作 对于F(2)= 2/8 + 3/6,等等。
基本上我想要总和:(有多少观察有时间i)/(有多少观察时间大于或等于i) 因此,对于i = 2,我有两个分数:2 /(8)+ 3 /(6),因为有6个观察值,时间i等于2或更多。
具体来说,我使用的是table
函数。但是,此功能为我提供频率,并将与频率相关的值视为级别而不是数字。
对于我的数据,我有5个级别:1,2,3,14,15但是当我尝试执行以下操作时:
v<-c(1,2,3,14,15)
ta<-as.data.frame(table(v))
as.numeric(ta$v)<14
[1] TRUE TRUE TRUE TRUE TRUE
但是,我希望结果为TRUE TRUE TRUE FALSE FALSE。我希望table()中的变量被视为数字。 我怎么能这样做?
为了看看我在做什么,我的额外代码如下。它在没有审查的情况下运作良好,但这部分对我来说是推进审查的关键。
cumh<-function (x,t,y=rep(1,length(x))){
le<-length(x)
#Sum comparison of terms
isum<-sum(x<=t)
#Collapse table
ta<-as.data.frame((table(x)))
ta$cum<-cumsum(ta$Freq)
ta$den<-le
for (j in 1:(nrow(ta)-1)) {
ta$den[j+1]<-le-ta$cum[j]
}
ind<-isum>=ta$cum
#correction for right censor:
ta2<-as.data.frame(table(y*x))
cumhaz<-sum(ind*ta2$Freq/ta$den)
return(cumhaz)}
答案 0 :(得分:0)
以下是使用sapply
和table
x <- c(1,1,2,2,2,3,14,25)
myTab <- table(x)
myTab / sapply(seq_along(myTab), function(i) sum(tail(c(0, myTab), -i)))
x
1 2 3 14 25
0.2500000 0.5000000 0.3333333 0.5000000 1.0000000
这里,tail
连续从x的开头删除值。其余值汇总在一起。 sapply
为从x的开头到最终值的值执行此操作。为了实现这一点,我预先将0添加到x。然后,求和除以x以返回比例。