为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

人到中年有点甜 2019-05-24 16:19:20
将多组测量列(宽格式)整形为单列(长格式)我有一个宽格式的数据帧,在不同的日期范围内重复测量。在我的例子中,有三个不同的时期,都有相应的值。例如,第一测量(Value1)是在测量期间从DateRange1Start到DateRange1End: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 我希望将数据重新整形为长格式,以便将DateRangeXStart和DateRangeXEnd列分组。因此,原始表中的1行在新表中变为3行:ID DateRangeStart DateRangeEnd Value1 1/1/90 3/1/90 4.41 4/5/91 6/7/91 6.21 5/5/95 6/6/96 3.3我知道必须有一种方法可以用reshape2/ melt/ recast/ 来做到这一点tidyr,但我似乎无法弄清楚如何以这种特殊方式将多组度量变量映射到单个值列集。
查看完整描述

4 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

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

(根据Josh的建议添加了v.names。)


查看完整回答
反对 回复 2019-05-24
?
MMMHUHU

TA贡献1834条经验 获得超8个赞


以下是使用问题的方法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


查看完整回答
反对 回复 2019-05-24
  • 4 回答
  • 0 关注
  • 603 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信