如何用pivot_longer将多变量宽格式时间序列数据转长格式
解决方案
方法一:基于你现有代码的扩展
你已经通过pivot_longer+separate得到了长格式数据,只需要再加一步pivot_wider就能转成目标格式:
data %>% pivot_longer(-ParticipantNumber) %>% separate(name, into = c("time", "measure"), sep = 3) %>% pivot_wider(names_from = measure, values_from = value)
方法二:一步到位的简洁写法
不用拆分再重组,直接利用pivot_longer的names_pattern参数一次性完成转换,效率更高:
data %>% pivot_longer( cols = -ParticipantNumber, names_to = c("time", ".value"), names_pattern = "^(.{3})(.*)" )
代码说明:
names_to = c("time", ".value"):把列名拆成两部分,第一部分存入time列,第二部分作为新的列名(.value是tidyr的特殊关键字,用来指定这部分对应值的列)names_pattern = "^(.{3})(.*)":正则表达式匹配规则,捕获列名的前3个字符(比如T1_、T2_)作为time列内容,剩下的部分(比如v1_total、v1_Vig)作为新列名
如果想让time列去掉下划线(变成T1而非T1_),可以调整正则规则:
data %>% pivot_longer( cols = -ParticipantNumber, names_to = c("time", ".value"), names_pattern = "^(T\\d)_(.*)" )
内容的提问来源于stack exchange,提问作者walkabilly
相关产品推荐
相关产品推荐

