R公式:如何使用公式将计算约束到两组?

R公式:如何使用公式将计算约束到两组?,r,R,我想为log rank test构建事后测试,将各个组相互比较: library(survival) survdiff(DV ~ IV, data=mydf) 是否有任何方法可以这样做(例如,比较第2组和第7组): 我知道我可以从mydf和Surv对象DV df2vs7<-mydf[as.numeric(mydf$IV)==2 | as.numeric(mydf$IV)==7,] DV2vs7<-DV[as.numeric(mydf$IV)==2 | as.numeric(myd

我想为log rank test构建事后测试,将各个组相互比较:

library(survival)
survdiff(DV ~ IV, data=mydf)
是否有任何方法可以这样做(例如,比较第2组和第7组):


我知道我可以从
mydf
Surv
对象
DV

df2vs7<-mydf[as.numeric(mydf$IV)==2 | as.numeric(mydf$IV)==7,]
DV2vs7<-DV[as.numeric(mydf$IV)==2 | as.numeric(mydf$IV)==7,]
类似这样的东西

survdiff(DV~IV,data=mydf[as.numeric(mydf$IV)%in%c(2,7),])

类似的东西


survdiff(DV~IV,data=mydf[as.numeric(mydf$IV)%in%c(2,7),])
在(嵌套)循环中使用
subset
参数来
survdiff
。您可能需要调整循环以避免一个接一个的错误,但您已经明白了

l <- list()
n <- <no. of groups>
mydf$IV <- as.numeric(mydf$IV)
for(i in seq_len(n - 1))
{
    for(j in seq(i + 1, to=n, by=1))
    {
        l <- c(l, survdiff(DV ~ factor(IV), mydf, subset=IV %in% c(i, j)))
    }
}

l在(嵌套)循环中使用
subset
参数来
survdiff
。您可能需要调整循环以避免一个接一个的错误,但您已经明白了

l <- list()
n <- <no. of groups>
mydf$IV <- as.numeric(mydf$IV)
for(i in seq_len(n - 1))
{
    for(j in seq(i + 1, to=n, by=1))
    {
        l <- c(l, survdiff(DV ~ factor(IV), mydf, subset=IV %in% c(i, j)))
    }
}

l好的,这是一个复制粘贴解决方案。假设我们有
df
a
dataframe
对象,其中我们有
IV
分类变量和
length(levels(df$IV))
levels,以及
df
类型的
Surv
对象,我们希望在每对组之间执行成对的对数秩测试

library(gregmisc)
levels<-sort(unique(as.numeric((mydf$IV))))
groups<-combinations(length(levels),2,levels)
#or if we assume that levels produced by as.numeric(mydf$IV) are in sequence 1:n, we can use more efficient:
#groups<-combinations(length(levels(df$IV)),2)
library(plyr)
alply(groups, 1, 
    function(pair) {
        survdiff(DV ~ factor(IV), mydf, subset=IV %in% c(pair[[1]], pair[[2]]))
    }
)
库(gregmisc)

级别好的,这是一个复制粘贴解决方案。假设我们有
df
a
dataframe
对象,其中我们有
IV
分类变量和
length(levels(df$IV))
levels,以及
df
类型的
Surv
对象,我们希望在每对组之间执行成对的对数秩测试

library(gregmisc)
levels<-sort(unique(as.numeric((mydf$IV))))
groups<-combinations(length(levels),2,levels)
#or if we assume that levels produced by as.numeric(mydf$IV) are in sequence 1:n, we can use more efficient:
#groups<-combinations(length(levels(df$IV)),2)
library(plyr)
alply(groups, 1, 
    function(pair) {
        survdiff(DV ~ factor(IV), mydf, subset=IV %in% c(pair[[1]], pair[[2]]))
    }
)
库(gregmisc)

levels与“高度低效”部件不一致。@zx8754为什么?另外,它需要的内存大约是原始mydf所需内存的(n-1)倍。R不能廉价地(即通过引用)子集行。不同意“高度低效”部分。@zx8754为什么?另外,它需要的内存大约是原始mydf所需内存的(n-1)倍。R不能廉价地(即通过引用)对行进行子集划分。从技术上讲,它不是我问题的答案(它不会改变公式),但它确实解决了我的问题。您还应该对
DV
对象执行相同的操作(它不能是数据帧的一部分,因为它是
Surv
)是来自相同
mydf
数据帧的
DV
I
变量?实际上它是
IV
而不是
I
(打字)。是的,它们来自同一个数据集,但是
DV
属于
Surv
类型。据我所知,当您对一个数据帧进行子集时,您会排除每一列的行,因此
DV
IV
是我的解决方案的子集。是的。我不知道,Surv可以是数据帧的一部分!我以为只有
因子
向量
类型才可以!从技术上讲,这不是我问题的答案(它不会改变公式),但它确实解决了我的问题。您还应该对
DV
对象执行相同的操作(它不能是数据帧的一部分,因为它是
Surv
)是来自相同
mydf
数据帧的
DV
I
变量?实际上它是
IV
而不是
I
(打字)。是的,它们来自同一个数据集,但是
DV
属于
Surv
类型。据我所知,当您对一个数据帧进行子集时,您会排除每一列的行,因此
DV
IV
是我的解决方案的子集。是的。我不知道,Surv可以是数据帧的一部分!我以为只有
因子
向量
类型才可以!比我聪明的人可能会用
*apply
重写。粘贴在单独答案中的版本是你答案的
plyr
ed和大修版本。比我聪明的人可能会用
*apply
重写。粘贴在单独答案中的版本是你答案的
plyr
ed和大修版本你的回答。