Skip to content
Prev 374393 / 398530 Next

how can I convert a long to wide matrix?

Here is a stab in the dark. I agree with Jim that the description of the 
problem is hard to follow. The original posting being in HTML format did 
not help.

#########
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#>     filter, lag
#> The following objects are masked from 'package:base':
#>
#>     intersect, setdiff, setequal, union
library(tidyr)

# indenting was just a side-effect of me cleaning up the HTML mess
dat <- structure( list( ID = structure( c( 1L, 1L, 1L, 2L, 2L)
                                       , .Label = c("id_X","id_Y")
                                       , class = "factor"
                                       )
                       , EventDate = structure( c( 4L, 5L, 2L
                                                 , 3L, 1L )
                                              , .Label = c( "9/15/16"
                                                          , "9/15/17"
                                                          , "9/7/16"
                                                          , "9/8/16"
                                                          , "9/9/16"
                                                          )
                                              , class = "factor"
                                              )
                       , timeGroup = structure( c( 1L, 1L, 2L, 1L, 2L)
                                              , .Label = c("B1", "B2")
                                              , class = "factor"
                                              )
                       , SITE = structure( c( 1L, 1L, 2L, 1L, 2L)
                                         , .Label = c("A", "B" )
                                         , class = "factor"
                                         )
                       )
                 , .Names = c( "ID", "EventDate"
                             , "timeGroup", "SITE")
                 , class = "data.frame"
                 , row.names = c(NA, -5L)
                 )
dat2 <- (   dat
         %>% mutate( EventDate = as.Date( as.character( EventDate )
                                        , format = "%m/%d/%y"
                                        )
                   )
         %>% arrange( ID, timeGroup, EventDate )
         %>% group_by( ID, timeGroup )
         %>% top_n( 1, EventDate )
         %>% ungroup
         )
dat2
#> # A tibble: 4 x 4
#>   ID    EventDate  timeGroup SITE
#>   <fct> <date>     <fct>     <fct>
#> 1 id_X  2016-09-09 B1        A
#> 2 id_X  2017-09-15 B2        B
#> 3 id_Y  2016-09-07 B1        A
#> 4 id_Y  2016-09-15 B2        B
dat3a <- (   dat2
          %>% mutate( timeGroup = paste( "EventDate"
                                       , timeGroup
                                       , sep="_"
                                       )
                    )
          %>% select( ID, timeGroup, EventDate )
          %>% spread( timeGroup, EventDate )
          )
dat3a
#> # A tibble: 2 x 3
#>   ID    EventDate_B1 EventDate_B2
#>   <fct> <date>       <date>
#> 1 id_X  2016-09-09   2017-09-15
#> 2 id_Y  2016-09-07   2016-09-15
dat3b <- (   dat2
          %>% mutate( timeGroup = paste( "SITE"
                                       , timeGroup
                                       , sep = "_"
                                       )
                    )
          %>% select( ID, timeGroup, SITE )
          %>% spread( timeGroup, SITE )
          )
dat3b
#> # A tibble: 2 x 3
#>   ID    SITE_B1 SITE_B2
#>   <fct> <fct>   <fct>
#> 1 id_X  A       B
#> 2 id_Y  A       B
dat4 <- (   dat3a
         %>% left_join( dat3b, by = "ID" ) )
dat4
#> # A tibble: 2 x 5
#>   ID    EventDate_B1 EventDate_B2 SITE_B1 SITE_B2
#>   <fct> <date>       <date>       <fct>   <fct>
#> 1 id_X  2016-09-09   2017-09-15   A       B
#> 2 id_Y  2016-09-07   2016-09-15   A       B
#########
On Wed, 2 May 2018, Jim Lemon wrote:

            
---------------------------------------------------------------------------
Jeff Newmiller                        The     .....       .....  Go Live...
DCN:<jdnewmil at dcn.davis.ca.us>        Basics: ##.#.       ##.#.  Live Go...
                                       Live:   OO#.. Dead: OO#..  Playing
Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
/Software/Embedded Controllers)               .OO#.       .OO#.  rocks...1k