2012-01-03 47 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