首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在R中拆分列名并将数据从宽格式转换为长格式

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

Stack Overflow用户
提问于 2014-08-12 18:57:50
回答 3查看 2.3K关注 0票数 7

我有一个大的数据集,我需要从宽格式转换成长格式。这应该很简单,在这个论坛上有许多如何做到这一点的例子。但是,在这种情况下,我还需要拆分宽格式中使用的列标题,并为每个列创建一个长格式的列。

示例数据集

代码语言:javascript
运行
复制
 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

我想要的是这样的

代码语言:javascript
运行
复制
 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

我在这个论坛上看了许多例子,这些例子将融化数据以转换为长格式,还有一些在分隔符处进行列分割的例子,但我未能将两者结合起来。

EN

Stack Overflow用户

回答已采纳

发布于 2014-08-13 05:19:30

以下是“现代”:-)这方面的方法:

代码语言:javascript
运行
复制
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表示,从字符串的末尾向后转到五个字符,然后在那里分割。因此,如果您将"North2010“作为一个可能的名称,这将仍然有效。

也就是说,使用@David这样的正则表达式更可靠,这在separate中也是可能的。

代码语言:javascript
运行
复制
data %>%
  gather(var, Response, East2010:West2011) %>%
  separate(var, c("Site", "Year"), 
           sep = "(?<=[[:alpha:]])(?=[[:digit:]])", 
           perl = TRUE)
票数 5
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25272018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档