在r中将具有时间变量的纵向数据从宽格式转换为长格式

时间:2019-02-19 14:32:39

标签: r dataframe tidyr data-cleaning

随着时间的推移,我获得了对多个物体进行多次测量的纵向数据。数据为长格式,包含数百个变量和案例:

Id    Time1   Measurement11  ...   Time2    Measurement21   ...
 1     50.4    23             ...   52.1    25               ...
 2     64.3    30             ...   67.9    35               ...
 3     70.1    20             ...   72.3    29               ...

我想将其转换为宽格式以进行绘图

Id    Time    Measurement1 ...
 1     50.4    23           ...
 1     52.1    25           ...
 2     64.3    30           ...
 2     67.9    35           ...
 3     70.1    20           ...
 4     72.3    29           ...

我检查了收集,融化,重塑,重塑2上的资源,但似乎它们处理的情况是有多个包含所有测量值的时间列。到目前为止,我还没有找到一种在保持时间和测量的成对依赖性的同时转换数据的好方法。

我当前的解决方案是写

attatch(data)
temp1<-bind_cols(Time1,Measurement11)
temp2<-bind_cols(Time2,Measurement21)

wide_format_measurement1<-bind_rows(temp1,temp2,...)

它可以工作,因为只有5个时间变量,但是效率似乎并不高。我可以使用unite创建数据对,然后使用collect,最后使用单独的数据。但这本质上与bind_cols方法相同。必须有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

这还应扩展到更多情况(例如time3,measure3,time4,measure4等),只要它们各自以数字结尾。诀窍是首先gather()向上填充所有非变量列,然后separate()并使用经过精心选择的sep自变量。

library(tidyverse)

df %>%
  gather(key, value, -id) %>%
  separate(key, c("var", "num"), sep = "(?=[[:digit:]])") %>%
  spread(var, value) %>%
  arrange(id) %>%
  select(-num)