如何解决R:整理和汇总tidyverse样式的配对比较数据集 更新
我有一个数据集,特征{a,b,c ...}属于一组{a,b,c},属于一对玩家。每行代表一场比赛的结果,列 name_1 , name_2 代表玩家名称,所有其他列 a1,a2,b1,b2,c1,c2,等等。代表与比赛中玩家相对应的数字特征。
以下是数据集的示例:
set.seed(17)
df <- tibble(
name_1 = sample(letters[1:3],length(letters),replace = TRUE),name_2 = sample(letters[1:3],a1 = rnorm(length(letters)),a2 = rnorm(length(letters)),b1 = rnorm(length(letters)),b2 = rnorm(length(letters)),c1 = rnorm(length(letters)),c2 = rnorm(length(letters))) %>%
filter(!(name_1 == name_2))
我需要的是找到按玩家分组的每个功能的摘要统计信息。麻烦在于,同一位玩家(例如 a )有时可以位于 name_1 下,有时可以位于 name_2 下,因此他的功能可能是位于 feature1 或 feature2 。
这是我为一位玩家(即 a )和一项功能(即 a )做的尝试:
df %>%
mutate(feature_a_joined = case_when(df$name_1 == "a" ~ a1,df$name_2 == "a" ~ a2)) %>%
summarise(mean = mean(feature_a_joined,na.rm = TRUE))
我对R相当陌生,但是我在多个小插曲中看到的示例涉及更多标准数据集。有没有一种有效的方法来为每个球员和每个变量进行总结?
更新 我的预期结果将是这样的:
# A tibble: 3 x 4
player feature_a_mean feature_b_mean feature_c_mean
<chr> <dbl> <dbl> <dbl>
1 a -0.330 2.38 0.960
2 b -0.482 1.30 0.207
3 c -0.482 -0.477 -1.71
解决方法
我们可以使用map
。从数据获取唯一的列名('un1')。遍历那些(map
),用case_when
应用OP的代码并获得mean
library(dplyr)
library(purrr)
library(stringr)
un1 <- unique(str_remove(names(df)[-(1:2)],"\\d+"))
map_dfc(un1,~
df %>%
summarise(!! str_c('mean_',.x) :=
mean(case_when(name_1 == .x ~ !! rlang::sym(str_c(.x,'1')),name_2 == .x ~ !! rlang::sym(str_c(.x,'2'))),na.rm = TRUE)))
-输出
# A tibble: 1 x 3
# mean_a mean_b mean_c
# <dbl> <dbl> <dbl>
#1 -0.00673 0.186 -0.0632
更新
基于OP的预期输出(假设输出值是占位符),我们使用pivot_longer
将多个列块整形为'long'格式,并进行分组以获得summarise
{ {1}}列“ a”至“ c”
across
-输出
library(tidyr)
df %>%
pivot_longer(everything(),names_to = c('.value','grp'),names_sep= '(?<=[a-z])_?(?=[0-9])') %>%
group_by(player = name) %>%
summarise(across(a:c,mean,na.rm = TRUE),.groups = 'drop')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。