【问题标题】:unbalanced panel data to long format不平衡面板数据转长格式
【发布时间】:2021-06-01 13:24:14
【问题描述】:

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

X M_1.ccc M_1.ccc.1 M_1.ccc.2 M_2.ccc M_2.ccc.1 M_2.ccc.2
1 XXX. XXX. XXX. XXX. XXX. XXX.
2 XXX. XXX. XXX. XXX. XXX. XXX.
....
20 XXX. XXX. XXX. XXX. XXX. XXX.
21 XXX. XXX. XXX.
22 XXX. XXX. XXX.

我需要那个长格式的表格

Wave id ccc . ccc.1 ccc.2
1 1 XXX. XXX. XXX.
2 1 XXX. XXX. XXX.
....
20 1 XXX. XXX. XXX.
21 1 XXX. XXX. XXX.
22 1 XXX. XXX. XXX.
1 2 XXX. XXX. XXX.
2 2 XXX. XXX. XXX.
....
20 2 XXX. XXX. XXX.

我正在尝试在那里使用panelr 包和long_panel 函数:https://jacob-long.com/post/panelr-intro/,但那里没有太多示例

这个尝试不起作用

> long_panel(data_full, prefix="_", wave=X)

当我设置句号时(每个参与者都不同),这是一个缺失的起点......

test<-long_panel(data_full,
              prefix="_",
              wave=X,
              begin=1,
              end=2)

嗯,它实际上不是 1,但应该是空的......它返回错误:

if (ncol(nn) != 2L) stop("无法从名称中猜测时变变量") 中的错误: 参数长度为零

关于如何解决这个问题的任何想法?

样本数据:

dat <- structure(list(X = c("1", "2", "3", "4", "5", "6"), MLC_1.c3d = c("12.061268", 
"12.166716", "12.292454", "12.439793", "12.608850", "12.799803"
), MLC_1.c3d.1 = c("-1.138404", "-1.275099", "-1.402655", "-1.523949", 
"-1.642789", "-1.761063"), MLC_1.c3d.2 = c("9.136170", "9.374666", 
"9.601912", "9.818493", "10.023846", "10.217005"), MLC_1.c3d.3 = c("87.739037", 
"88.746254", "89.675377", "90.512108", "91.259438", "91.935745"
), MLC_1.c3d.4 = c("25.202179", "25.669239", "26.133680", "26.592773", 
"27.045420", "27.492346"), MLC_1.c3d.5 = c("-7.886568", "-8.132847", 
"-8.310396", "-8.435491", "-8.530880", "-8.623341")), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

【问题讨论】:

  • 您能否将您的示例数据包含为代码,以便我们以与您相同的形式加载它?例如使用dput(head(YOUR_DATA)) 并包含输出的代码。

标签: r panel-data


【解决方案1】:

这是一种使用 {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)

【讨论】:

  • Paul - 与上述问题相关,但仍然是额外的 - 我需要清除我的正则表达式 - 我总是无助地绊倒它们。什么是最好的资源?除了练习-练习-练习?另外,有备忘单吗?把它贴在墙上,每隔一分钟看一次?
  • 这是我每次看的:rexegg.com/regex-quickstart.html
【解决方案2】:

这是使用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")

【讨论】:

    猜你喜欢
    • 2020-01-13
    • 2020-06-07
    • 2017-01-19
    • 2014-10-30
    • 2017-03-20
    • 2021-08-25
    • 2014-12-02
    • 2021-11-16
    • 2019-06-18
    相关资源
    最近更新 更多