2012-01-03 49 views
0

我经常发现需要从手稿中重新创建表以进行进一步分析。这如何最容易实现?重新创建R表中的计数并模拟多变量分析

例如:

enter image description here

有一种简单的方法来重新创建共4列的数据框(脑梗塞(Y/N),结果(差/好),再出血(Y/N)和处理(尼莫地平,安慰剂)和276个+ 278行,这样我可以进一步分析此

编辑:如迪文指出的类别不是相互排斥的,因此需要模拟观察到的响应

+0

不知道如果我理解你的问题 - 你想_simulate_从汇总表中创建的原始数据,或者你想从其他手稿表_recreate_到您自己的报告? – 2012-01-03 11:37:04

+0

我想“模拟”汇总表的原始数据以便随后进一步分析并检查其结果 – Misha 2012-01-03 11:49:09

+0

'?gl'在此处可能很有用 – baptiste 2012-01-03 22:25:32

回答

1

我希望我真实您完全明白您的意图:重新创建上表创建的原始数据。

R中的上述表格(我不跟数字打交道括号内的表):

tab <- as.data.frame(matrix(c(61, 55, 25, 92, 91, 38), 3, 2)) 
row.names(tab) <- c('Cerebral infarct', 'Poor outcome', 'Rebleed') 
names(tab) <- c('Nimodipine', 'placebo') 

其中在返回:

> tab 
       Nimodipine placebo 
Cerebral infarct   61  92 
Poor outcome    55  91 
Rebleed     25  38 

不是最漂亮的解决方案,但容易跟随:我抓住上表中的每个单元格,并将所需变量的逻辑值向量n次返回,然后转换为数据帧:

res <- lapply(names(tab), function(col) 
    lapply(row.names(tab), function(row) 
     rep(c(row=='Cerebral infarct', row=='Poor outcome', row=='Rebleed', col=='Nimodipine'), tab[row, col]) 
)) 
res <- rapply(res, function(x) x) 
res <- as.data.frame(matrix(res, , 4, byrow=T)) 
names(res) <- c(row.names(tab), names(tab)[1]) 

结果:

> str(res) 
'data.frame': 362 obs. of 4 variables: 
$ Cerebral infarct: logi TRUE TRUE TRUE TRUE TRUE TRUE ... 
$ Poor outcome : logi FALSE FALSE FALSE FALSE FALSE FALSE ... 
$ Rebleed   : logi FALSE FALSE FALSE FALSE FALSE FALSE ... 
$ Nimodipine  : logi TRUE TRUE TRUE TRUE TRUE TRUE ... 

PS:数据帧持有362案件你可以看到感谢:

> sum(tab) 
[1] 362 

PS:感谢@迪文的评论,我才意识到我没拿关心可能的重叠。

+1

最好避免使用名称“table”作为数据对象,因为这恰好也是一个非常有用的函数的名称。我也对统计数据表示担忧。我没有看到任何迹象表明这些是相互排斥的结果。这些类别之间肯定存在系统性重叠。我会在你的第一个六行之后停下来,因为我认为数据演示文稿不支持下一步。 – 2012-01-03 15:14:17

+0

包xtable可能对于将表格转换为乳胶格式也很有用 – 2012-01-04 04:12:17

+0

谢谢@DWin,你真的是对的 - 像往常一样:)将无论如何,在这里留下我的答案,并附上一些关于'table'命名的修改。可悲的是,我没有记住一些重叠的事实可能是:(这也是有道理的。 – daroczig 2012-01-04 08:18:26

0

正如Dwin指出的 - 我没有忘记类别之间的重叠。

这是我对模拟数据集和运行基于报告数据的多变量分析...因此,在调整其他变量后,治疗似乎与结果有关。

treat<-factor(c(rep("Placebo",276),rep("Nimodipine",278))) 
infarct<-factor(rep("No",554),levels=c("No","Yes")) 
outcome<-factor(rep("Good",554),levels=c("Good","Poor")) 
rebleed<-factor(rep("No",554),levels=c("No","Yes")) 

df<-data.frame(treat=treat,infarct=infarct,outcome=outcome,rebleed=rebleed) 

fun<-function(df){ 
    d<-df 
    nimo<-subset(d,treat=="Nimodipine") 
    place<-subset(d,treat=="Placebo") 
    nimo$infarct[sample(c(1:278),61)]<-"Yes" 
    nimo$outcome[sample(c(1:278),55)]<-"Poor" 
    nimo$rebleed[sample(c(1:278),25)]<-"Yes" 
    place$infarct[sample(c(1:276),92)]<-"Yes" 
    place$outcome[sample(c(1:276),91)]<-"Poor" 
    place$rebleed[sample(c(1:276),38)]<-"Yes" 
    d<-rbind(nimo,place) 
    return(d) 
} 

fun2<-function(df){ 

    glm(outcome~rebleed+infarct+treat,data=df,family=binomial)->f 
    exp(coef(f))->f2 
return(f2) 
} 

lis.data<-list(10000) 


for (j in 1:10000){ 
lis.data[[j]]<-fun(df) 
} 

lis.reg<-matrix(NA,10000,4) 
for (j in 1:10000){ 
lis.reg[j,]<-fun2(lis.data[[j]]) 
} 
par(mfrow=c(2,2)) 
for (j in 1:4){ 
    plot(lis.reg[,j]) 
} 

enter image description here