我有一个宽格式的数据帧,在不同的日期范围内进行重复测量。在我的示例中,有三个不同的句号,每个句号都有相应的值。例如,第一次测量(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
,一定有办法做到这一点,但我似乎不知道如何以这种特定的方式将多组度量变量映射到单组值列。
发布于 2012-09-18 04:31:51
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 Value
1.1 1 1 1/1/90 3/1/90 4.4
1.2 1 2 4/5/91 6/7/91 6.2
1.3 1 3 5/5/95 6/6/96 3.3
(添加了v.names per Josh的建议。)
发布于 2014-06-24 04:05:20
以下是使用tidyr
解决此问题的方法。这是它的函数extract_numeric()
的一个有趣的用例,我用它从列名中取出组
library(dplyr)
library(tidyr)
a <- read.table(textConnection("
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
"),header=TRUE)
a %>%
gather(variable,value,-ID) %>%
mutate(group = extract_numeric(variable)) %>%
mutate(variable = gsub("\\d","",x = variable)) %>%
spread(variable,value)
ID group DateRangeEnd DateRangeStart Value
1 1 1 3/1/90 1/1/90 4.4
2 1 2 6/7/91 4/5/91 6.2
3 1 3 6/6/96 5/5/95 3.3
发布于 2018-04-10 19:00:02
使用回收:
data.frame(ID = d[, 1],
DateRangeStart = unlist(d[, -1][, c(TRUE, FALSE, FALSE)]),
DateRangeEnd = unlist(d[, -1][, c(FALSE, TRUE, FALSE)]),
Value = unlist(d[, -1][, c(FALSE, FALSE, TRUE)]))
https://stackoverflow.com/questions/12466493
复制相似问题