在R中重构纵向数据时,如何创建新的分组变量?

时间:2015-08-18 15:48:25

标签: r panel-data

我一直在阅读R中的reshape2包和其他包中的文档,用于重构从长到长格式的数据,反之亦然。但是,我坚持这个问题,因为我需要为时间创建一个新变量,并按时间对我的激素测量进行分组。我之前在SPSS中做过这个,虽然我正在切换到R,其原因显而易见。我知道在R中必须有一种简单的方法可以做到这一点,但我很难搞清楚这一点。

该项目的数据来自一项纵向临床研究,其中为每位患者在5个不同的时间点测量了20种不同的激素(示例化妆数据如下 - a1是激素' at' at访问1,a2是激素'访问2等等)。该研究共有20名患者,每个患者在电子表格(id)中都有唯一的标识符。激素数据(激素' a'激素''等)在我的电子表格中以如下广泛的形式安排:

> id     a1     a2     a3     a4     a5    b1     b2     b3     b4     b5...
>  1     21     50     28     19     15    24     90     40     35     20...
>  2     23     45     15     22     20    25     45     34     31     22...
>  3     29     88     33     32     21    78     32     33     45     21...
...

当我以前在SPSS中执行此操作时,软件会提示我输入id变量以及变量名称以将纵向测量折叠成。我会创建一个名为&#34的新变量;访问"这是从1到5,这相当于我对每种激素的5次测量。当我在SPSS中执行此操作时,它会以长格式创建一个新输出,如下所示:

> id     visit      a     b
> 1          1     21    24
> 1          2     50    90
> 1          3     28    40
> 1          4     19    35
> 1          5     15    20
> 2          1     23    25
> 2          2     45    45
> 2          3     15    34
> 2          4     22    31
> 2          5     20    22
> 3          1     29    78
...

我尝试过使用重塑功能,但该功能似乎有效,但是当我查看实际数据时,数字在广泛格式和长格式之间变得混杂。我必须做一些非常基本的错误,但我很难搞清楚。

d_long <- reshape(d, varying = c("a1", "a2", "a3", "a4", "a5", 
    "b1", "b2", "b3", "b4", "b5"), v.names = c("a", "b"), 
    idvar = "id", times = c(1:5), direction = "long")

4 个答案:

答案 0 :(得分:0)

我认为你应该使用reshape()函数并使用参数timevar指定新的时间变量。

答案 1 :(得分:0)

可以使用melt的开发版data.table轻松完成此操作。安装devel版本的说明是here

我们转换了&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df1))。然后,我们在patterns的{​​{1}}参数中指定measure以匹配多个melt列。

measure

数据

library(data.table)
dM <- melt(setDT(df1), measure=patterns(c('^a\\d+', '^b\\d+')),
          value.name=c('a', 'b'), variable.name='visit')[order(id)]
dM
#    id visit  a  b
# 1:  1     1 21 24
# 2:  1     2 50 90
# 3:  1     3 28 40
# 4:  1     4 19 35
# 5:  1     5 15 20
# 6:  2     1 23 25
# 7:  2     2 45 45
# 8:  2     3 15 34
# 9:  2     4 22 31
#10:  2     5 20 22
#11:  3     1 29 78
#12:  3     2 88 32
#13:  3     3 33 33
#14:  3     4 32 45
#15:  3     5 21 21

答案 2 :(得分:0)

以下是关于在长格式和宽格式之间转换数据的一个很好的总结。

Use R and SAS to reshape the data format: long to wide and wide to long

答案 3 :(得分:0)

使用基础R重塑:

res <- reshape(df1, direction = "long", varying = list(2:6, 7:11), idvar = "id",
               v.names = c("a", "b"), timevar = "visit")
res[order(res$id),]

给出:

    id visit  a  b
1.1  1     1 21 24
1.2  1     2 50 90
1.3  1     3 28 40
1.4  1     4 19 35
1.5  1     5 15 20
2.1  2     1 23 25
2.2  2     2 45 45
2.3  2     3 15 34
2.4  2     4 22 31
2.5  2     5 20 22
3.1  3     1 29 78
3.2  3     2 88 32
3.3  3     3 33 33
3.4  3     4 32 45
3.5  3     5 21 21