R数据帧到3维的表格

时间:2017-04-25 00:13:31

标签: r

这是发病率数据。农场和年份的死亡和危险时间相结合 我正在尝试使用method =将数据放入epi.2by2所需的格式  “cohort.time”(epiR包)。

示例数据:

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

需要输出:

    , , 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

等。

我尝试过以几种方式使用table(),但它为每个farm_year层提供了大量0的扩展表。我确定这是一个简单的答案(重塑?xtabs?)我找不到它!

2 个答案:

答案 0 :(得分:1)

这有点疏忽:

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

答案 1 :(得分:1)

使用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