gpt4 book ai didi

r - 如何在 R 中将宽嵌套数据 reshape 为长格式?

转载 作者:行者123 更新时间:2023-12-02 16:20:42 25 4
gpt4 key购买 nike

我有一个看起来像这样的数据集,其中每个教室(ID)有不同的团队(A,B),每个团队有 3 个分数(例如,team1_1 team1_2 team1_3)以及每个团队的平均分数。换句话说,教室(ID)1 有两个团队(A、B),教室 2 有两个团队(A、B),依此类推。

df <- data.frame(ID=1:5,
Team1=c("A","A","A","A","A"),
Team1_1=c(2,3,1,3,4),
Team1_2=c(4,2,2,3,2),
Team1_3=c(5,3,4,5,4),
Team1_Mean=c(3.67,2.67,2.33,3.67,3.33),
Team2=c("B","B","B","B","B"),
Team2_1=c(4,3,3,5,4),
Team2_2=c(4,2,2,5,2),
Team2_3=c(4,4,4,5,3),
Team2_Mean=c(4,3,3,5,3))


ID Team1 Team1_1 Team1_2 Team1_3 Team1_Mean Team2 Team2_1 Team2_2 Team2_3 Team2_Mean
1 A 2 4 5 3.67 B 4 4 4 4
2 A 3 2 3 2.67 B 3 2 4 3
3 A 1 2 4 2.33 B 3 2 4 3
4 A 3 3 5 3.67 B 5 5 5 5
5 A 4 2 4 3.33 B 4 2 3 3

我想 reshape 数据,以便每个团队都以长格式列出,如下所示:

df2 <- data.frame(ID=c(1,1,2,2,3,3,4,4,5,5),
Team=c("A", "B", "A", "B", "A", "B", "A", "B", "A", "B"),
Score1=c(2,4,3,3,1,3,3,5,4,5),
Score2=c(4,4,2,2,2,2,3,5,2,2),
Score3=c(5,4,3,4,4,4,5,5,4,3),
Mean=c(3.67,4,2.67,3,2.33,3,3.67,5,3.33,3))


ID Team Score1 Score2 Score3 Mean
1 A 2 4 5 3.67
1 B 4 4 4 4.00
2 A 3 2 3 2.67
2 B 3 2 4 3.00
3 A 1 2 4 2.33
3 B 3 2 4 3.00
4 A 3 3 5 3.67
4 B 5 5 5 5.00
5 A 4 2 4 3.33
5 B 5 2 3 3.00

在我看来,我认为将每个团队的数据放在一个列表中,重新调整为长格式,然后取消嵌套数据就可以解决问题,但这并不那么容易。我的第一步是这样的:

df <- df %>% nest(items = c("Team1", "Team1_1", "Team1_2", "Team1_3", "Team1_Mean"))
names(df)[names(df) == "items"] <- "Team1"
df <- df %>% nest(items = c("Team2", "Team2_1", "Team2_2", "Team2_3", "Team2_Mean"))
names(df)[names(df) == "items"] <- "Team2"


# A tibble: 5 x 3
ID Team1 Team2
<int> <list> <list>
1 1 <tibble [1 × 5]> <tibble [1 × 5]>
2 2 <tibble [1 × 5]> <tibble [1 × 5]>
3 3 <tibble [1 × 5]> <tibble [1 × 5]>
4 4 <tibble [1 × 5]> <tibble [1 × 5]>
5 5 <tibble [1 × 5]> <tibble [1 × 5]>

从那里我尝试了我常用的 reshape2 (melt) 函数,但 R 说它已被弃用,所以我尝试了 tidyr 的“gather”方法,但似乎这些努力不适用于列表。

我的问题是:

  1. 如何实现我想要的结果?
  2. 我的数据集包含数百个 ID 和团队,因此我不想像上面那样输入每个变量;如何简化此过程以减少硬编码的使用?

提前非常感谢!

最佳答案

一个选项是 pivot_longer 。我们可以rename列 'Team1'、'Team2' 添加分隔符 ( _ ) 以及后缀 'Team',然后使用 pivot_longer reshape 为 'long' 格式指定cols与除“ID”( -ID ) 之外的所有内容一样,指定 names_sep_然后rename以数字开头并附加“Score”作为前缀的列名称

library(dplyr)
library(tidyr)
library(stringr)
df %>%
rename_at(vars(matches("^Team\\d+$")), ~ str_c(., "_Team")) %>%
pivot_longer(cols = -ID, names_to = c("grp", ".value"),
names_sep="_")%>%
rename_at(vars(matches('^\\d+')), ~ str_c("Score", .)) %>%
select(-grp)

-输出

# A tibble: 10 x 6
# ID Team Score1 Score2 Score3 Mean
# <int> <chr> <dbl> <dbl> <dbl> <dbl>
# 1 1 A 2 4 5 3.67
# 2 1 B 4 4 4 4
# 3 2 A 3 2 3 2.67
# 4 2 B 3 2 4 3
# 5 3 A 1 2 4 2.33
# 6 3 B 3 2 4 3
# 7 4 A 3 3 5 3.67
# 8 4 B 5 5 5 5
# 9 5 A 4 2 4 3.33
#10 5 B 4 2 3 3

关于r - 如何在 R 中将宽嵌套数据 reshape 为长格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65570796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com