首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将多组测量列(宽格式)重塑为单列(长格式)

将多组测量列(宽格式)重塑为单列(长格式)
EN

Stack Overflow用户
提问于 2012-09-18 04:17:30
回答 4查看 19.9K关注 0票数 51

我有一个宽格式的数据帧,在不同的日期范围内进行重复测量。在我的示例中,有三个不同的句号,每个句号都有相应的值。例如,第一次测量(Value1)是在从DateRange1StartDateRange1End的时间段内测量的:

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,一定有办法做到这一点,但我似乎不知道如何以这种特定的方式将多组度量变量映射到单组值列。

EN

回答 4

Stack Overflow用户

发布于 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的建议。)

票数 41
EN

Stack Overflow用户

发布于 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
票数 19
EN

Stack Overflow用户

发布于 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)]))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12466493

复制
相关文章

相似问题

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