在R中使用过滤函数。需要为赛马数据库分配NA并保持数据集长度相同

在R中使用过滤函数。需要为赛马数据库分配NA并保持数据集长度相同,r,filter,R,Filter,我对这个小组和R还是新手。 我在上一个问题上得到了一些非常有用的反馈,希望我能 以下是更多的支持: 我正在研究一个赛马数据库,在这个阶段有4个变量: 赛马编号、比赛id、比赛距离和分配给马的等级(DaH) 比赛的表现 数据集: horse_ratings <- tibble( horse=c(1,1,1,2,2,2,3,3,3), raceid=c(1,2,3,1,2,3,1,2,3), Dist=c(9.47,9.47,10,10.1,10.2,9,11,9.47,10.5)

我对这个小组和R还是新手。 我在上一个问题上得到了一些非常有用的反馈,希望我能 以下是更多的支持:

我正在研究一个赛马数据库,在这个阶段有4个变量: 赛马编号、比赛id、比赛距离和分配给马的等级(DaH) 比赛的表现

数据集:

horse_ratings <- tibble(
  horse=c(1,1,1,2,2,2,3,3,3),
  raceid=c(1,2,3,1,2,3,1,2,3),
  Dist=c(9.47,9.47,10,10.1,10.2,9,11,9.47,10.5),
  DaH=c(101,99,103,101,94,87,102,96,62)
)
horse_评级horse_评级
#一个tibble:9x4
马总状花序区
1     1      1  9.47   101
2     1      2  9.47    99
3     1      3 10      103
4     2      1 10.1    101
5     2      2 10.2     94
6     2      3  9       87
7     3      1 11      102
8     3      2  9.47    96
9     3      3 10.5     62
我将在数据集上执行一些计算,如平均评级、最大评级等 我想得到一些长度相等的向量

我使用过滤函数来查看不同类型的性能等级 比赛距离(即起跑距离大于10)。但是,如果其中一匹马没有 跑这段距离,然后我注意到结果不包括这一点 输出中的马。即:

> horse_ratings %>% 
+   group_by(horse) %>% 
+   filter(Dist>10) %>%
+   summarise(mean_rating=mean(DaH))
`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 2 x 2
  horse mean_rating
  <dbl>       <dbl>
1     2        97.5
2     3        82
>马的评级%>%
+组别(马)%>%
+过滤器(距离>10)%>%
+总结(平均值=平均值(DaH))
`summary()`解组输出(用`.groups`参数重写)
#一个tibble:2x2
马平均值
1     2        97.5
2     3        82
所以马1已经消失了,因为它没有跑超过10英里的距离。 理想情况下,我需要保持输出向量的长度为3,这样我就可以进行所有的计算 输入到相同长度的数据帧(用于最终数据输出/打印)。 我希望有一种方法可以为horse 1的输出分配NA或类似的值 给予:

#一个tible:2x2
马平均值
11NA
2     2        97.5
3     3        82
或者类似的解决方案。
非常感谢您的帮助

您可以使用
分组依据()
中的
.drop=FALSE
参数:

horse\u评级%>%
分组依据(马,.drop=FALSE)%>%
过滤器(距离>10)%>%
总结(平均值=平均值(DaH))
马平均值
11楠
2     2        97.5
3     3        82  

不要
筛选
首先,在
摘要
中进行筛选,这样就不会删除组(

库(dplyr)
马_评级%>%
组别(马)%>%
总结(平均值=平均值(DaH[Dist>10],na.rm=TRUE))
#一个tibble:3x2
#马平均值
#         
#11楠
#2     2        97.5
#3     3        82  
方法1:

horse_stats <- 
  horse_ratings %>% 
  mutate(raceid = as.factor(raceid)) %>% 
  filter(Dist > 10) %>% 
  group_by(horse) %>% 
  summarise_if(is.numeric, c("sum", "mean", "max", "min")) %>% 
  ungroup() %>% 
  left_join(horse_ratings %>% 
              select(horse) %>% 
              distinct(), 
            ., by = "horse", all.x = TRUE)
horse\u统计数据%
突变(外消旋体=同因子(外消旋体))%>%
过滤器(距离>10)%>%
组别(马)%>%
如果(是数字,c(“总和”、“平均值”、“最大值”、“最小值”))%%,则总结
解组()%>%
左加入(马评分%>%
选择(马)%>%
不同的(),
,by=“horse”,all.x=TRUE)
方法2:

horse_stats <- 
  horse_ratings %>% 
  mutate(raceid = factor(raceid),
         Dist = ifelse(Dist <= 10, 0, Dist), 
         DaH = ifelse(Dist == 0, 0, Dist)) %>% 
  group_by(horse) %>% 
  summarise_if(is.numeric, c("sum", "mean", "max", "min")) %>% 
  ungroup() %>% 
  mutate_if(is.numeric, list(~na_if(., 0)))
horse\u统计数据%
变异(外消旋体=因子(外消旋体),
Dist=ifelse(Dist%
组别(马)%>%
如果(是数字,c(“总和”、“平均值”、“最大值”、“最小值”))%%,则总结
解组()%>%
mutate_if(is.numeric,list(~na_if(,0)))
horse_ratings %>%
 group_by(horse, .drop = FALSE) %>% 
 filter(Dist > 10) %>%
 summarise(mean_rating = mean(DaH))

  horse mean_rating
  <dbl>       <dbl>
1     1       NaN  
2     2        97.5
3     3        82  
library(dplyr)

horse_ratings %>% 
     group_by(horse) %>% 
     summarise(mean_rating = mean(DaH[Dist>10], na.rm = TRUE))

# A tibble: 3 x 2
#  horse mean_rating
#  <dbl>       <dbl>
#1     1       NaN  
#2     2        97.5
#3     3        82  
library(tidyverse)
horse_stats <- 
  horse_ratings %>% 
  mutate(raceid = as.factor(raceid)) %>% 
  filter(Dist > 10) %>% 
  group_by(horse) %>% 
  summarise_if(is.numeric, c("sum", "mean", "max", "min")) %>% 
  ungroup() %>% 
  left_join(horse_ratings %>% 
              select(horse) %>% 
              distinct(), 
            ., by = "horse", all.x = TRUE)
horse_stats <- 
  horse_ratings %>% 
  mutate(raceid = factor(raceid),
         Dist = ifelse(Dist <= 10, 0, Dist), 
         DaH = ifelse(Dist == 0, 0, Dist)) %>% 
  group_by(horse) %>% 
  summarise_if(is.numeric, c("sum", "mean", "max", "min")) %>% 
  ungroup() %>% 
  mutate_if(is.numeric, list(~na_if(., 0)))