将多组测量列(宽格式)整形为单列(长格式)

将多组测量列(宽格式)整形为单列(长格式)

我有一个宽格式的数据帧,在不同的日期范围内重复测量。在我的例子中,有三个不同的时期,都有相应的值。例如,第一测量(Value1)是在测量期间从DateRange1Start到DateRange1End:


ID DateRange1Start DateRange1End Value1 DateRange2Start DateRange2End Value2 DateRange3Start DateRange3End Value3

1 1/1/90 3/1/90 4.4 4/5/91 6/7/91 6.2 5/5/95 6/6/96 3.3 

我希望将数据重新整形为长格式,以便将DateRangeXStart和DateRangeXEnd列分组。因此,原始表中的1行在新表中变为3行:


ID DateRangeStart DateRangeEnd Value

1 1/1/90 3/1/90 4.4

1 4/5/91 6/7/91 6.2

1 5/5/95 6/6/96 3.3

我知道必须有一种方法可以用reshape2/ melt/ recast/ 来做到这一点tidyr,但我似乎无法弄清楚如何以这种特殊方式将多组度量变量映射到单个值列集。


人到中年有点甜
浏览 606回答 4
4回答

慕慕森

reshape(dat, idvar="ID", direction="long",              varying=list(Start=c(2,5,8), End=c(3,6,9), Value=c(4,7,10)),             v.names = c("DateRangeStart", "DateRangeEnd", "Value") )#-------------    ID time DateRangeStart DateRangeEnd Value1.1  1    1          1/1/90        3/1/90    4.41.2  1    2          4/5/91        6/7/91    6.21.3  1    3          5/5/95        6/6/96    3.3(根据Josh的建议添加了v.names。)

MMMHUHU

以下是使用问题的方法tidyr。这是一个有趣的用例,它extract_numeric()用于从列名中提取组library(dplyr)library(tidyr)a <- read.table(textConnection("ID DateRange1Start DateRange1End Value1 DateRange2Start DateRange2End Value2 DateRange3Start DateRange3End Value31 1/1/90 3/1/90 4.4 4/5/91 6/7/91 6.2 5/5/95 6/6/96 3.3&nbsp;"),header=TRUE)a %>%&nbsp; gather(variable,value,-ID) %>%&nbsp; mutate(group = extract_numeric(variable)) %>%&nbsp; mutate(variable =&nbsp; gsub("\\d","",x = variable)) %>%&nbsp; spread(variable,value)&nbsp; ID group DateRangeEnd DateRangeStart Value1&nbsp; 1&nbsp; &nbsp; &nbsp;1&nbsp; &nbsp; &nbsp; &nbsp;3/1/90&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1/1/90&nbsp; &nbsp;4.42&nbsp; 1&nbsp; &nbsp; &nbsp;2&nbsp; &nbsp; &nbsp; &nbsp;6/7/91&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;4/5/91&nbsp; &nbsp;6.23&nbsp; 1&nbsp; &nbsp; &nbsp;3&nbsp; &nbsp; &nbsp; &nbsp;6/6/96&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;5/5/95&nbsp; &nbsp;3.3
打开App,查看更多内容
随时随地看视频慕课网APP