首页 > 解决方案 > 如何拆分数据框的列并重塑它?

问题描述

我正在尝试重构数据,以便将包含多个值的列展开以匹配我在下面列出的所需输出?我做了几次尝试,tidyr::spread()tidyr::gather()都无济于事。有任何想法吗?

dat <- data.frame("name" = c("a", "b", "c"), 
                  "count" = c("2003=22; 2004=32", 
                              "2003=34; 2005=45", 
                              "2005=32; 2006=67"))


name            count
a               2003=22; 2004=32
b               2003=34; 2005=45
c               2005=32; 2006=67

期望的输出:

name    2003    2004    2005    2006    
a        22     32      NA      NA
b        34     NA      45      NA      
c        NA     NA      32      67

标签: rsplitreshape

解决方案


可能有一种更聪明、更简洁的方法,但这很有效:

library(tidyr)
dat %>% 
  separate(count, sep = "; ", into = c("c1", "c2")) %>% 
  gather(Var, Val, -name) %>% 
  separate(Val, sep = "=", into = c("year", "value")) %>% 
  select(-Var) %>% 
  spread(year, value)

  name 2003 2004 2005 2006
1    a   22   32 <NA> <NA>
2    b   34 <NA>   45 <NA>
3    c <NA> <NA>   32   67

请注意,这会导致“宽”数据;传播之前的“长”数据可能更容易处理。


推荐阅读