我有纵向数据,随着时间的推移,对多个物体进行多次测量。数据采用长格式,包含数百个变量和案例:
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来创建数据对,然后使用gather,最后使用单独的。但这与bind_cols方法基本相同。肯定有更好的办法?
这也应该扩展到更多情况(例如,时间3,测量3,时间4,测量4等),只要它们各自以数字结尾。诀窍是首先向所有非变量列gather()
,然后用精心挑选的separate()
参数sep
。
library(tidyverse)
df %>%
gather(key, value, -id) %>%
separate(key, c("var", "num"), sep = "(?=[[:digit:]])") %>%
spread(var, value) %>%
arrange(id) %>%
select(-num)