在R中拆分列名称并将数据从宽格式转换为长格式

use*_*924 5 r reshape

我有一个大型数据集,需要将其从宽格式转换为长格式。这应该足够简单,并且在该论坛上有很多有关如何执行此操作的示例。但是,在这种情况下,我还需要拆分宽格式使用的列标题,并为每个长格式创建一个列。

示例数据集

 data <- data.frame("East2010"=1:3, "West2010"=4:6, "East2011"=7:9, "West2011"=5:7)
 data
 East.2010 West.2010 East.2011 West.2011
 1         1         4         7         5
 2         2         5         8         6
 3         3         6         9         7
Run Code Online (Sandbox Code Playgroud)

我想要的是这样的

 Site   Year   Response
 East   2010   1
 East   2010   2
 East   2010   3
 West   2010   4
 West   2010   5
 West   2010   6
 East   2011   7
 East   2011   8
 East   2011   9
 West   2011   5
 West   2011   6
 West   2011   7
Run Code Online (Sandbox Code Playgroud)

我在这个论坛上看了很多示例,这些示例将融合数据以将其转换为长格式,而其他示例则在定界符处进行列拆分,但是我无法使两者一起工作。

A5C*_*2T1 5

这是“现代”:-) 方法:

library(dplyr)
library(tidyr)
data %>%
  gather(var, Response, East2010:West2011) %>%  ## Makes wide data long
  separate(var, c("Site", "Year"), sep = -5)    ## Splits up a column
#    Site Year Response
# 1  East 2010        1
# 2  East 2010        2
# 3  East 2010        3
# 4  West 2010        4
# 5  West 2010        5
# 6  West 2010        6
# 7  East 2011        7
# 8  East 2011        8
# 9  East 2011        9
# 10 West 2011        5
# 11 West 2011        6
# 12 West 2011        7
Run Code Online (Sandbox Code Playgroud)

sep = -5上面说,从字符串的结尾往回走五个字符和分裂那里。因此,如果您将“North2010”作为可能的名称,这仍然有效。

也就是说,使用像@David's 这样的正则表达式更可靠,这也可以在separate:

data %>%
  gather(var, Response, East2010:West2011) %>%
  separate(var, c("Site", "Year"), 
           sep = "(?<=[[:alpha:]])(?=[[:digit:]])", 
           perl = TRUE)
Run Code Online (Sandbox Code Playgroud)