Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何将TIBLE传递给函数并计算条件SUMIF_R_Tidyverse - Fatal编程技术网

R 如何将TIBLE传递给函数并计算条件SUMIF

R 如何将TIBLE传递给函数并计算条件SUMIF,r,tidyverse,R,Tidyverse,我正在尝试编写一个函数,它将根据棒球运动员的得分计算得分。我创建了splits Tibble、working Tibble和一个函数,与mutate函数一起使用,向working Tibble df添加一个score列 该函数应该从工作TIBLE中获取输入,并根据相关分割计算分数(平均值之和)。我提供了以下reprex。当我尝试执行我的函数时,我得到的分数是零。预期得分值遵循reprex 谁能告诉我我做错了什么 库(tidyverse) 分裂球员分裂平均值 #> #>1索托格拉斯20

我正在尝试编写一个函数,它将根据棒球运动员的得分计算得分。我创建了splits Tibble、working Tibble和一个函数,与mutate函数一起使用,向working Tibble df添加一个score列

该函数应该从工作TIBLE中获取输入,并根据相关分割计算分数(平均值之和)。我提供了以下reprex。当我尝试执行我的函数时,我得到的分数是零。预期得分值遵循reprex

谁能告诉我我做错了什么

库(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