将R中的问题分组,以找到具有条件的平均值



我有一个类似的数据帧:

df <- data.frame(flight_no = c(515,4370,3730,4687,1124), dep_delay = c(-10, 95, -7, 4, 6), is_delayed = c('no', 'yes', 'no', 'yes', 'yes'), distance = c(1065,628,719,569,2565))

#>   flight_no dep_delay is_delayed  distance
#> 1  515       -10          'no'      1065
#> 2  4370      95           'yes'     628
#> 3  3730      -7           'no'      719
#> 4  4687      4            'yes'     569
#> 4  1124      6            'yes'     2565

我需要找到超过1000英里的航班的平均(平均(延误,以及(平均(航程小于1000英里的航班延误,仅过滤延误的航班。

我试过这个

df %>%
filter(is_delayed =='yes') %>%                            # Find delayed flights
group_by(distance >1000) %>%                              # Group by distance over 1000 miles
summarise(avg = mean(dep_delay),                    # Summarise and find the mean delay
count = n())
Output:
A tibble: 2 × 3
`distance > 1000`   avg count
<lgl>             <dbl> <int>
1 FALSE              49.5     2
2 TRUE                6       1

这似乎是正确的。真的有办法将FALSE和TRUE分别更改为"距离小于1000"one_answers"距离大于1000"吗?也许有更好的方法可以做到这一点。我是R.的新手

您可以方便地使用aggregate

aggregate(dep_delay ~ distance > 1000, df, subset=is_delayed == 'yes', 
(x) c(mean=mean(x), n=length(x)))
#   distance > 1000 dep_delay.mean dep_delay.n
# 1           FALSE           49.5         2.0
# 2            TRUE            6.0         1.0

您可以使用ifelse来更改级别,使用round来舍入值。

df %>% 
filter(is_delayed == "yes") %>% 
group_by(distance_1000 = ifelse(distance > 1000, "distance more than 1000", "distance less or equal to 1000")) %>% 
summarise(avg = round(mean(dep_delay), 2),
count = n())
#                    distance_1000  avg count
# 1 distance less or equal to 1000 49.5     2
# 2        distance more than 1000  6.0     1

使用sapply基础R替代方案
with允许使用列名,而不必引用data.frame。
do.call将函数<>传递到距离列表。还验证是否为分层是";是";,全部应用于列dep_delay
然后检查结果列表lislengthmean值。

sapply(c("<", ">"), function(x){ 
lis <- with(df, df[do.call(x, list(distance, 1000)) & 
is_delayed == "yes", "dep_delay"])
data.frame(count = length(lis), avg = mean(lis)) 
})
<    >
count 2    1
avg   49.5 6

请记住,这(根据问题中的定义(不包括1000。使用<=>=或添加==作为第三个函数以包含1000。

sapply(c("<", ">=", "=="), function(x){ 
lis <- with(df, df[do.call(x, list(distance, 1000)) & 
is_delayed == "yes", "dep_delay"])
data.frame(count = length(lis), avg = mean(lis)) 
})
<    >= == 
count 2    1  0  
avg   49.5 6  NaN

最新更新