2017-04-25 6 views
1

Dies sind Inzidenzdaten. Todesfälle und Zeitrisiko geschichtet nach Farm und Jahr kombiniert Ich versuche, die Daten in das für epi.2by2 benötigte Format mit method = "cohort.time" (epiR-Paket) zu bringen.R Datenfeld in Tabelle mit 3 Dimensionen

Beispieldaten:

test <- rbind(c(12, 2,0), c(29,16,26), c(6941, 6083, 5051), c(4555, 5148, 3608)) 
colnames(test) <- c(3, 3.5, 4) 
rownames(test) <- c("deaths-unexposed", "deaths-exposed", "timeatrisk-unexposed", "timeatrisk-exposed") 

farm-year    3 3.5 4 
deaths-unexposed  12 2 0 
deaths-exposed   29 16 26 
timeatrisk-unexposed 6941 6083 5051 
timeatrisk-exposed 4555 5148 3608 

Ausgang benötigt:

, , farm_year = 3 

      deaths timeatrisk 
exposed  
     1  29  6941 
     0  12  4555 

    , , farm_year = 3.5 

      deaths timeatrisk 
exposed  
     1  16  6083 
     0  2  6148 

usw.

Ich versuchte Tabelle() auf verschiedene Weise, aber es gibt mir erweiterten Tabellen mit vielen 0'en für jede farm_year Schicht. Ich bin sicher, es ist eine einfache Antwort (umgestalten? XTabs?) Ich kann es einfach nicht finden!

Antwort

1

Es ist ein bisschen von munging:

library(tidyverse) 

test_tab <- test %>% 
    t() %>% # transpose matrix 
    as.data.frame() %>% 
    rownames_to_column('farm_year') %>% 
    gather(var, val, -farm_year) %>% # reshape to long form 
    separate(var, c('variable', 'exposed')) %>% # separate variables 
    xtabs(val ~ exposed + variable + farm_year, .) 

test_tab 
#> , , farm_year = 3 
#> 
#>   variable 
#> exposed  deaths timeatrisk 
#> exposed  29  4555 
#> unexposed  12  6941 
#> 
#> , , farm_year = 3.5 
#> 
#>   variable 
#> exposed  deaths timeatrisk 
#> exposed  16  5148 
#> unexposed  2  6083 
#> 
#> , , farm_year = 4 
#> 
#>   variable 
#> exposed  deaths timeatrisk 
#> exposed  26  3608 
#> unexposed  0  5051 
+0

Dies tut es - ich tidyverse mein Paket Repertoire hinzufügen werden! – CaitlinP

1

Mit data.table

test <- as.data.table(t(rbind(c(12, 2,0), c(29,16,26), c(6941, 6083, 5051), c(4555, 5148, 3608)))) 

colnames(test) <- c("deaths-unexposed", "deaths-exposed", "timeatrisk-unexposed", "timeatrisk-exposed") 
test[, farm_year := c(3, 3.5, 4)] 

result <- melt(test, measure = patterns("^deaths", "timeatrisk"), value.name = c("deaths", "timeatrisk"), variable.name = "Exposed", variable.factor=FALSE) 
result[, Exposed := as.numeric(Exposed) - 1] 

result[farm_year==3] 
    farm_year Exposed deaths timeatrisk 
1:   3  0  12  6941 
2:   3  1  29  4555 

result[farm_year==3.5] 
    farm_year Exposed deaths timeatrisk 
1:  3.5  0  2  6083 
2:  3.5  1  16  5148 
+0

Das ist gut, aber ich brauchte es als Tabelle und nicht nur als Teilmenge zu sehen. – CaitlinP

Verwandte Themen