2017-02-11 40 views
0

我想学习如何编写函数R我有一个非常具体的问题关于使用表和如何处理“水平变量”。表频率数值分类操作函数

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

实施例:数据x= c(1,1,2,2,2,3,14,25)具有8个观测/倍

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

  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)} 

回答

0

下面是使用sapplytable

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除以返回比例。