简体   繁体   中英

error spreading data set in R

I have a long data set that is broken down by geographical location and year, with about 5 variables of interest (see structure blow), every time I try to convert it to wide form, I get told that there's duplication so it can't.

df
Yr    Geo     Obs1  Obs2  
2001  Dist1    1     3     
2002  Dist1    2     5   
2003  Dist1    4     2    
2004  Dist1    2     1   
2001  Dist2    1     3     
2002  Dist2   .9     5     
2003  Dist2    6     8     
2004  Dist2    2    .2     

I want to convert it into something like this

yr    dist1obs1  dist1obs2  dist2obs1 dist2obs2
2001
2002
2003
2004

Looking for something like this...?

> reshape(df, v.names= c("Obs1", "Obs2"), idvar="Yr", timevar ="Geo", direction="wide")
    Yr Obs1.Dist1 Obs2.Dist1 Obs1.Dist2 Obs2.Dist2
1 2001          1          3        1.0        3.0
2 2002          2          5        0.9        5.0
3 2003          4          2        6.0        8.0
4 2004          2          1        2.0        0.2

Here is a solution using tidyr . Because spread works with one key-value pair, you need to first gather the Obs and unite the dist with it so that you have one key-value pair to work with. I also set the column names to be lower case as shown in the requested output.

library(tidyverse)
tbl <- read_table2(
  "Yr    Geo     Obs1  Obs2
  2001  Dist1    1     3
  2002  Dist1    2     5
  2003  Dist1    4     2
  2004  Dist1    2     1
  2001  Dist2    1     3
  2002  Dist2   .9     5
  2003  Dist2    6     8
  2004  Dist2    2    .2"
)

tbl %>%
  gather("obsnum", "obs", Obs1, Obs2) %>%
  unite(colname, Geo, obsnum, sep = "") %>%
  spread(colname, obs) %>%
  `colnames<-`(str_to_lower(colnames(.)))
#> # A tibble: 4 x 5
#>      yr dist1obs1 dist1obs2 dist2obs1 dist2obs2
#>   <int>     <dbl>     <dbl>     <dbl>     <dbl>
#> 1  2001        1.        3.     1.00      3.00 
#> 2  2002        2.        5.     0.900     5.00 
#> 3  2003        4.        2.     6.00      8.00 
#> 4  2004        2.        1.     2.00      0.200

Created on 2018-04-19 by the reprex package (v0.2.0).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM