表频率数值类别操作函数

时间:2017-02-11 21:35:06

标签: r contingency

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

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

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

  1. 从矢量8观察到F(14)= 2/8 + 3/6 + 1/3 + 1/2的以下操作 对于F(2)= 2/8 + 3/6,等等。

  2. 基本上我想要总和:(有多少观察有时间i)/(有多少观察时间大于或等于i) 因此,对于i = 2,我有两个分数:2 /(8)+ 3 /(6),因为有6个观察值,时间i等于2或更多。

  3. 具体来说,我使用的是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)}
    

1 个答案:

答案 0 :(得分: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以返回比例。