如何在R中投射超过3列的数据帧?

时间:2018-04-26 22:52:05

标签: r casting reshape tidyr reshape2

从Access数据库导入,我的数据与此类似:

p <- data.frame(SurvDate = as.Date(c('2018-11-1','2018-11-1','2018-11-1',
                                     '2018-11-3', '2018-11-3')), 
                Area = c('AF','BB','CT', 'DF', 'BB'), 
                pCount = c(6, 3, 0, 12, 32), 
                ObsTime = c('8:51','8:59','9:13', '9:24', '9:30'), 
                stringsAsFactors = FALSE)

我想将Rows的数据转换为SurvDate,并将列转换为Area(值为pCount),并将每个Area旁边的ObsTime列转换为值ObsTime。

示例:

n <- data.frame(SurvDate = as.Date(c('2018-11-1','2018-11-3')), 
                AF = c(6, NA), 
                TimeAF = c('8:51', NA), 
                BB = c(3, 32), 
                TimeBB = c('8:59', '9:30'), 
                CT = c(0, NA), 
                TimeCT = c(NA, '9:13'), 
                DF = c(NA,12), 
                TimeDF = c(NA, '9:24'))

我已经尝试过这个主题的变体,但是没有时间去工作。

library(reshape2)
dcast(p, SurvDate+ObsTime ~ Area)

1 个答案:

答案 0 :(得分:0)

以下是使用tidyverse工具的一种方法。请注意,输出与预期输出不同,因为您似乎没有将CT的值放在正确的位置(值分布在两个日期)。方法是unite值,因此我们只有一个键值对spread,然后再用mutate_at分隔列。我们也可以多次使用separate,但这会因为Area太多而变得笨拙。

SurvDate <- as.Date(c('2018-11-1','2018-11-1','2018-11-1', '2018-11-3', '2018-11-3'))
Area <- c('AF','BB','CT', 'DF', 'BB')
People <- c(6, 3, 0, 12, 32)
ObsTime <- (c('8:51','8:59','9:13', '9:24', '9:30'))
p <- data.frame(SurvDate, Area, People, ObsTime, stringsAsFactors = FALSE)

library(tidyverse)
p %>%
  unite(vals, People, ObsTime) %>%
  spread(Area, vals) %>%
  mutate_at(
    .vars = vars(-SurvDate),
    .funs = funs(
      Time = str_extract(., "(?<=_).*$"),
      Area = str_extract(., "^.*(?=_)")
    )
  ) %>%
  filter(!is.na(SurvDate)) %>%
  select(SurvDate,  matches("_")) %>%
  select(SurvDate, order(colnames(.)))
#>     SurvDate AF_Area AF_Time BB_Area BB_Time CT_Area CT_Time DF_Area
#> 1 2018-11-01       6    8:51       3    8:59       0    9:13    <NA>
#> 2 2018-11-03    <NA>    <NA>      32    9:30    <NA>    <NA>      12
#>   DF_Time
#> 1    <NA>
#> 2    9:24

reprex package(v0.2.0)创建于2018-04-30。