celestialgod

dplyr data manipulation

Aug 6th, 2015
384
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 1.89 KB | None | 0 0
  1. library(data.table)
  2. library(reshape2)
  3. library(dplyr)
  4. library(tidyr)
  5. library(magrittr)
  6. dat = data.table(ID = rep(LETTERS[1:2], 4:3),
  7.   location = c('TAI', 'JP', 'CH', 'KOE', 'JP', 'GOK', 'TA'),
  8.   year = c(2012, 2013, 2014, 2011, 2011, 2015, 2012),
  9.   sex = rep(c("F", "M"), 4:3))
  10. ## 1
  11. dat %>% group_by(ID, sex) %>%
  12.   mutate(location_name = paste0("location_", 1:n())) %>%
  13.   select(-year) %>% spread(location_name, location, fill = "")
  14. #   ID sex location_1 location_2 location_3 location_4
  15. # 1  A   F        TAI         JP         CH        KOE
  16. # 2  B   M         JP        GOK         TA          
  17. ## 2
  18. dat %>% spread(year, location, fill="")
  19. ## dcast.data.table(dat, ID + sex ~ year, value.var = "location")
  20. #    ID sex 2011 2012 2013 2014 2015
  21. # 1:  A   F  KOE  TAI   JP   CH    
  22. # 2:  B   M   JP   TA            GOK
  23. ## 3
  24. dat %>% spread(year, location, fill="") %>%
  25.   setnames(as.character(2011:2015), paste0("year_", 2011:2015)) %>%
  26.   mutate(location = paste(year_2011, year_2012,year_2013,year_2014,year_2015, sep = ",")) %>%
  27.   mutate(location = gsub(',+', ',',gsub(',$', '', location))) %>%
  28.   select(ID, sex, location)
  29. #    ID sex       location
  30. # 1:  A   F  KOE,TAI,JP,CH
  31. # 2:  B   M      JP,TA,GOK
  32. ## 3 (method 2)
  33. dat3 = dat %>% mutate(ones = "c1") %>% select(-year) %>%
  34.   dcast.data.table(ID + sex ~ ones,
  35.     fun.aggregate = function(x){paste(x, collapse = ',')},
  36.     value.var = "location") %>% setnames("c1", "location")
  37. dat3
  38. #    ID sex      location
  39. # 1:  A   F TAI,JP,CH,KOE
  40. # 2:  B   M     JP,GOK,TA
  41.  
  42. ## 3 (method 2 with order of year)
  43. dat3_2 = dat %>% mutate(ones = "c1") %>%
  44.   arrange(ID, year) %>% select(-year) %>%
  45.   dcast.data.table(ID + sex ~ ones,
  46.     fun.aggregate = function(x){paste(x, collapse = ',')},
  47.     value.var = "location") %>% setnames("c1", "location")
  48. dat3_2
  49. #    ID sex      location
  50. # 1:  A   F KOE,TAI,JP,CH
  51. # 2:  B   M     JP,TA,GOK
Advertisement
Add Comment
Please, Sign In to add comment