带有圆形后缀的面板数据的 reshape() 的 tidyverse 替换
tidyverse replacement for reshape() for panel data with round suffix
本例中 reshape()
的 tidyverse
替代品是什么?我希望宽版采用回合名称:v2.1
和 v2.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
。这是所需的输出。寻找从 r1
和 r2
到此输出的 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"))
本例中 reshape()
的 tidyverse
替代品是什么?我希望宽版采用回合名称:v2.1
和 v2.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
。这是所需的输出。寻找从 r1
和 r2
到此输出的 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"))