我有一个大型数据集,需要将其从宽格式转换为长格式。这应该足够简单,并且在此论坛上有很多有关如何执行此操作的示例。但是,在这种情况下,我还需要拆分宽格式使用的列标题,并为每个长格式创建一个列。
示例数据集
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
我想要的是这样的
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
我在这个论坛上看了很多示例,这些示例将融合数据以将其转换为长格式,而其他示例则在定界符处进行列拆分,但是我无法使两者一起工作。
这是“现代” :-)方法:
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
sep = -5
上方的from表示从字符串末尾开始向后五个字符并在此处拆分。因此,如果您将“ North2010”作为可能的名称,则此名称仍然有效。
也就是说,使用@David之类的正则表达式更为可靠,这也可以在以下代码中使用separate
:
data %>%
gather(var, Response, East2010:West2011) %>%
separate(var, c("Site", "Year"),
sep = "(?<=[[:alpha:]])(?=[[:digit:]])",
perl = TRUE)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句