R 如何将TIBLE传递给函数并计算条件SUMIF
我正在尝试编写一个函数,它将根据棒球运动员的得分计算得分。我创建了splits Tibble、working Tibble和一个函数,与mutate函数一起使用,向working Tibble df添加一个score列 该函数应该从工作TIBLE中获取输入,并根据相关分割计算分数(平均值之和)。我提供了以下reprex。当我尝试执行我的函数时,我得到的分数是零。预期得分值遵循reprex 谁能告诉我我做错了什么R 如何将TIBLE传递给函数并计算条件SUMIF,r,tidyverse,R,Tidyverse,我正在尝试编写一个函数,它将根据棒球运动员的得分计算得分。我创建了splits Tibble、working Tibble和一个函数,与mutate函数一起使用,向working Tibble df添加一个score列 该函数应该从工作TIBLE中获取输入,并根据相关分割计算分数(平均值之和)。我提供了以下reprex。当我尝试执行我的函数时,我得到的分数是零。预期得分值遵循reprex 谁能告诉我我做错了什么 库(tidyverse) 分裂球员分裂平均值 #> #>1索托格拉斯20
库(tidyverse)
分裂球员分裂平均值
#>
#>1索托格拉斯200
#>2索托草皮225
#>3格拉斯法官250
#>4裁判场275
#>5索托日300
#>6索托之夜325
#>7法官日350
#>8法官之夜375
df
#>#tibble:4 x 4
#>日期播放器TOD表面
#>
#>1 2021-03-24索托日草
#>2021-03-27索托日草坪
#>3 2021-03-21法官日草坪
#>4 2021-03-25法官夜草
getSplitScore
#>1201-03-24索托日草0
#>2021-03-27索托日草坪0
#>3 2021-03-21法官日草坪0
#>4 2021-03-25法官夜草0
由(v0.3.0)于2021-03-27创建
我期待的是:
#> # A tibble: 4 x 5
#> date player TOD surface score
#> <chr> <chr> <chr> <chr> <int>
#> 1 2021-03-24 Soto DAY Grass 500
#> 2 2021-03-27 Soto DAY Turf 525
#> 3 2021-03-21 Judge DAY Turf 625
#> 4 2021-03-25 Judge NIGHT Grass 625
#>#tible:4 x 5
#>日期球员托德表面得分
#>
#>1201-03-24索托日草500
#>2021-03-27索托日草坪525
#>3 2021-03-21法官日草坪625
#>4 2021-03-25法官夜草625
首先,我会将您的split$split
列拆分为草皮和日期。一种不那么优雅的方法:
split <- split %>%
mutate(
TOD = ifelse(split %in% c('DAY', 'NIGHT'), split, 'NA'),
surface = ifelse(split %in% c('Grass', 'Turf'), split, 'NA'),
.keep = 'unused'
)
我确实看到输出不是您想要的,但也许您应该尝试更清楚地说明您正在尝试执行的操作。在执行mutate in pipe之前添加一个
group_by
。看
df %>% group_by(date, player) %>%
mutate(score= getSplitScore(split, player, surface, TOD))
# A tibble: 4 x 5
# Groups: date, player [4]
date player TOD surface score
<chr> <chr> <chr> <chr> <dbl>
1 2021-03-24 Soto DAY Grass 500
2 2021-03-27 Soto DAY Turf 525
3 2021-03-21 Judge DAY Turf 625
4 2021-03-25 Judge NIGHT Grass 625
df%>%groupby(日期、玩家)%>%
变异(分数=getSplitScore(分割、玩家、表面、TOD))
#一个tibble:4x5
#分组:日期、玩家[4]
日期球员托德表面得分
1201-03-24索托日草500
2021-03-27索托日草坪525
3 2021-03-21法官日草坪625
4 2021-03-25法官夜草625
拟议的替代战略
df %>% left_join(split, by = c("player" = "player", "TOD" = "split")) %>%
rbind(df %>% left_join(split, by = c("player" = "player", "surface" = "split"))) %>%
group_by(date, player, TOD, surface) %>%
summarise(AVG = sum(AVG))
# A tibble: 4 x 5
# Groups: date, player, TOD [4]
date player TOD surface AVG
<chr> <chr> <chr> <chr> <dbl>
1 2021-03-21 Judge DAY Turf 625
2 2021-03-24 Soto DAY Grass 500
3 2021-03-25 Judge NIGHT Grass 625
4 2021-03-27 Soto DAY Turf 525
df%>%left_-join(拆分,由=c(“player”=“player”,“TOD”=“split”))%>%
rbind(df%>%左联合(分割,由=c(“玩家”=“玩家”,“表面”=“分割”)))%>%
分组依据(日期、玩家、TOD、地面)%>%
总结(平均值=总和(平均值))
#一个tibble:4x5
#组:日期、玩家、TOD[4]
日期播放器TOD表面平均值
2021-03-21法官日草坪625
2021-03-24索托日草500
2021-03-25法官夜草625
4 2021-03-27索托日草坪525
在split
tibble中没有列BaVG
。我也不确定你是如何得出分数值的。在你想要的输出中,200分是Soto Day和Soto TOD的总和?我只需要一个关于如何计算分数的例子。分数只是分割BaVG/@WilliamGram Good catch的总分数。有时候你可能离事情太近了。谢谢谢谢你的回复。我的函数应该引用分割df。我不是试图总结df中的列,而是试图在df和split中的曲面和时间匹配时,从split中的AVG列计算分数。是的。知道了。看我修改过的答案。只需在dplyr管道中的mutate
之前添加一个groupby
,它就可以工作了。
df %>% group_by(date, player) %>%
mutate(score= getSplitScore(split, player, surface, TOD))
# A tibble: 4 x 5
# Groups: date, player [4]
date player TOD surface score
<chr> <chr> <chr> <chr> <dbl>
1 2021-03-24 Soto DAY Grass 500
2 2021-03-27 Soto DAY Turf 525
3 2021-03-21 Judge DAY Turf 625
4 2021-03-25 Judge NIGHT Grass 625
df %>% left_join(split, by = c("player" = "player", "TOD" = "split")) %>%
rbind(df %>% left_join(split, by = c("player" = "player", "surface" = "split"))) %>%
group_by(date, player, TOD, surface) %>%
summarise(AVG = sum(AVG))
# A tibble: 4 x 5
# Groups: date, player, TOD [4]
date player TOD surface AVG
<chr> <chr> <chr> <chr> <dbl>
1 2021-03-21 Judge DAY Turf 625
2 2021-03-24 Soto DAY Grass 500
3 2021-03-25 Judge NIGHT Grass 625
4 2021-03-27 Soto DAY Turf 525