r语言 - 不平衡面板数据为长格式



我在多个文件中有一个不同长度的面板数据。一个文件包括几个参与者的观察结果和每个参与者的几个指标,格式如下

<表类> X M_1.ccc M_1.ccc.1 M_1.ccc.2 M_2.ccc M_2.ccc.1 M_2.ccc.2 tbody><<tr>1XXX。XXX。XXX。XXX。XXX。XXX。2XXX。XXX。XXX。XXX。XXX。XXX。…20XXX。XXX。XXX。XXX。XXX。XXX。21XXX。XXX。XXX。22XXX。XXX。XXX。

这里有一个使用{tidyr}包的方法。

library(dplyr)
library(stringr)
library(tidyr)
dat %>%
rename("Wave" = "X") %>%
pivot_longer(-1, names_to = "id", values_to = "val") %>%
separate(id, c("id", "key"), sep = "(?<=MLC_\d).") %>%
pivot_wider(names_from = key, values_from = val) %>%
mutate(across("id", str_replace, "MLC_", "")) %>%
arrange(id, Wave)

我肯定有一种方法可以一步到位,但我还没有想出来。如果我算出来了,我会更新这个答案。

更新这个更整洁,一次完成旋转:

dat %>%
rename("Wave" = "X") %>%
pivot_longer(-1,
names_to = c("id", ".value"),
names_pattern = "MLC_(\d.*).(c.*)",
names_transform = list(id = as.integer)) %>%
arrange(id, Wave)

这是使用data.table的另一个解决方案(假设您的数据命名为df)。

library(data.table)
setnames(setDT(df), "X", "Wave")
melt(df, 
id = "Wave", 
measure = Map(function(x) paste0("MLC_", 1:2, ".", x), c("c3d", paste0("c3d.", 1:35))),
variable.name = "id")

最新更新