0

我正在尝试学习如何在R中编写函数,并且我有一个关于表的使用以及如何处理“级别变量”的非常具体的问题。

我最初的问题是编写一个累积风险函数。我的功能基本上是这样做的:

示例:x= c(1,1,2,2,2,3,14,25)具有 8 次观察/次的数据

  1. 对于 F(14)= 2/8 + 3/6+ 1/3+ 1/2 对于 F(2)= 2/8+3/6,从向量 8 个观测值执行以下操作,依此类推。

  2. 基本上我想要总和:(有多少观察有时间 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)}
4

1 回答 1

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 开始到最终值的值执行此操作。为了做到这一点,我在 x 前面加上了 0。然后总和除以 x 以返回比例。

于 2017-02-11T21:59:26.050 回答