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

问题描述 投票:0回答:1

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

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方法基本相同。肯定有更好的办法?

r dataframe tidyr data-cleaning
1个回答
1
投票

这也应该扩展到更多情况(例如,时间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)
© www.soinside.com 2019 - 2024. All rights reserved.