带有圆形后缀的面板数据的 reshape() 的 tidyverse 替换

tidyverse replacement for reshape() for panel data with round suffix

本例中 reshape()tidyverse 替代品是什么?我希望宽版采用回合名称:v2.1v2.2。我还以为应该是gather(),没想到

library(tidyverse)
r1 <- data.frame(id=c(1, 2, 3),
                 v1=c(1, 1, 0),
                 v2=c(0, 1, 1),
                 round=c(1, 1, 1))

r2 <- data.frame(id=c(1, 2, 3),
                 v2=c(1, 0, 0),
                 round=c(2, 2, 2))

r12 <- bind_rows(r1, r2)

r12w <- reshape(r12,
                timevar = "round",
                v.names = "v2",
                idvar = "id",
                direction = "wide")
r12w

#  id v1 v2.1 v2.2
#1  1  1    0    1
#2  2  1    1    0
#3  3  0    1    0

已更新 跨数据集行不平衡的示例。

r1 <- data.frame(id=c(1, 2, 3, 4),
                 v1=c(1, 1, 0, 0),
                 v2=c(0, 1, 1, 1),
                 round=c(1, 1, 1, 1))

r2 <- data.frame(id=c(1, 2, 3),
                 v2=c(1, 0, 0),
                 round=c(2, 2, 2))

这模仿了小组调查,其中有些人在后面的轮次中没有 found/refuse。此处,第 4 个人在 r1,但不在 r2。我们希望将此人保留在最终数据集中,但 NA 值为 v2。这是所需的输出。寻找从 r1r2 到此输出的 tidverse 方法。

#  id v1 v2.1 v2.2
#1  1  1    0    1
#2  2  1    1    0
#3  3  0    1    0
#4  4  0    1   NA

我们在执行 bind_rows 之前通过从 'r1' 分配该列来创建 'r2' 中缺少的列。为此,我们可以使用 setdiff 来获取在 'r1' 而不是 'r2' 中找到的列。然后,paste 字符串 'v2.' 与 'round' 列和 spread 到 'wide' 格式

m1 <- setdiff(names(r1), names(r2))
r2[nm1] <- r1[nm1]
bind_rows(r1, r2) %>%
      mutate(round = paste0("v2.", round)) %>%
      spread(round, v2)
#  id v1 v2.1 v2.2
#1  1  1    0    1
#2  2  1    1    0
#3  3  0    1    0

注意:这里,我们假设数据集具有相同的行数

我不确定我是否完全理解你想要什么,但这是一个尝试:

library(dplyr)
full_join(r1, r2, by = "id", suffix = c(".1", ".2")) %>%
  select(-starts_with("round"))