提问人:Samuel Priestley 提问时间:4/4/2023 最后编辑:nrennieSamuel Priestley 更新时间:4/4/2023 访问量:34
数据整理扩大和整合行
Data wrangling widen and consolidate rows
问:
我想加宽一些行,然后使用 R 合并这些行。
组 ID | 人 | 角色 | 盈利 |
---|---|---|---|
group_1 | person_1 | 一个 | 10 |
group_1 | person_2 | B | 20 |
group_2 | person_3 | 一个 | 14 |
group_2 | person_4 | B | 14 |
group_3 | person_5 | 一个 | 34 |
group_3 | person_6 | B | 48 |
当我使用数据时,如下所示:pivot_wider(names_from = Role, values_from = c(Person, Payoff))
组 ID | 一个 | B | 回报 | B 收益 |
---|---|---|---|---|
group_1 | person_1 | 那 | 10 | 那 |
group_1 | 那 | person_2 | 那 | 20 |
group_2 | person_3 | 那 | 14 | 那 |
group_2 | 那 | person_4 | 那 | 14 |
group_3 | person_5 | 那 | 34 | 那 |
group_3 | 那 | person_6 | 那 | 48 |
但是,我希望数据如下表所示。我应该使用不同的命令还是应该使用其他方式?pivot_wider
组 ID | 一个 | B | 回报 | B 收益 |
---|---|---|---|---|
group_1 | person_1 | person_2 | 10 | 20 |
group_2 | person_3 | person_4 | 14 | 14 |
group_3 | person_5 | person_6 | 34 | 48 |
我还尝试了类似于以下命令的代码
data %>%
group_by('session_group_id') %>%
pivot_wider(names_from = Role, values_from = c(Person, Payoff))
和
data %>%
group_by('session_group_id') %>%
pivot_wider(names_from = Role,
values_from = c(Person, Payoff),
values_fn = list)
答:
2赞
DaveArmstrong
4/4/2023
#1
使用您的代码,我得到了正确的答案(v 1.3.0,v 1.1.0):tidyr
dplyr
library(tidyr)
library(dplyr)
dat <- read.table(header=TRUE,
text="
Group_ID Person Role Payoff
group_1 person_1 A 10
group_1 person_2 B 20
group_2 person_3 A 14
group_2 person_4 B 14
group_3 person_5 A 34
group_3 person_6 B 48
")
dat %>% pivot_wider(names_from = Role, values_from = c(Person, Payoff))
#> # A tibble: 3 × 5
#> Group_ID Person_A Person_B Payoff_A Payoff_B
#> <chr> <chr> <chr> <int> <int>
#> 1 group_1 person_1 person_2 10 20
#> 2 group_2 person_3 person_4 14 14
#> 3 group_3 person_5 person_6 34 48
创建于 2023-04-03 使用 reprex v2.0.2
评论
dat %>% pivot_wider(names_from = Role, values_from = c(Person, Payoff))
pivot_wider()
dat <- data.frame("Group ID" = rep(sprintf("group_%s",seq(1:3)), each = 2), Person = sprintf("person_%s",seq(1:6)), Role = rep(c("A", "B"), 3), Payoff = c(10,20,14,14,34,48), check.names = FALSE)