在R语言中筛选指定行分组计算均值的实现方法
问题描述
现有如下R数据框:
df <- structure(list(V1 = c(43.8735370052414, 43.2134452032708, 46.3127470212784, 47.9401589009531, 30.5684881461115, 32.5528665575571, 29.3035738750668, 30.9770316442935), Author = c("Arthur", "Mario", "ALPACA_M_19", "ALPACA_M_27", "Arthur", "Mario", "ALPACA_M_19", "ALPACA_M_27" ), Distance = c("G-RHI", "G-RHI", "G-RHI", "G-RHI", "NS-RHI", "NS-RHI", "NS-RHI", "NS-RHI"), Skull = c("W003", "W003", "W003", "W003", "W004", "W004", "W004", "W004")), row.names = c(NA, -8L ), class = "data.frame")
数据框视图:
> df V1 Author Distance Skull 1 43.87354 Arthur G-RHI W003 2 43.21345 Mario G-RHI W003 3 46.31275 ALPACA_M_19 G-RHI W003 4 47.94016 ALPACA_M_27 G-RHI W003 5 30.56849 Arthur NS-RHI W004 6 32.55287 Mario NS-RHI W004 7 29.30357 ALPACA_M_19 NS-RHI W004 8 30.97703 ALPACA_M_27 NS-RHI W004
目前已能通过以下代码按Skull和Distance分组,添加包含全组均值的Mean列:
library(dplyr) df %>% group_by(Skull, Distance) %>% mutate(Mean = mean(V1))
现在需要新增一列Mean_A_M,该列的均值仅基于Author为Arthur和Mario的行计算,且按Skull和Distance分组后将结果填充到该组所有行,预期输出如下:
# A tibble: 8 × 6 # Groups: Skull, Distance [2] V1 Author Distance Skull Mean Mean_A_M <dbl> <chr> <chr> <chr> <dbl> <dbl> 1 43.9 Arthur G-RHI W003 45.3 43.6 2 43.2 Mario G-RHI W003 45.3 43.6 3 46.3 ALPACA_M_19 G-RHI W003 45.3 43.6 4 47.9 ALPACA_M_27 G-RHI W003 45.3 43.6 5 30.6 Arthur NS-RHI W004 30.9 31.6 6 32.6 Mario NS-RHI W004 30.9 31.6 7 29.3 ALPACA_M_19 NS-RHI W004 30.9 31.6 8 31.0 ALPACA_M_27 NS-RHI W004 30.9 31.6
解决方案
可以在mutate中对V1添加条件筛选,仅计算Arthur和Mario行的均值,同时保留分组逻辑:
library(dplyr) df %>% group_by(Skull, Distance) %>% mutate( Mean = mean(V1), Mean_A_M = mean(V1[Author %in% c("Arthur", "Mario")], na.rm = TRUE) )
代码说明
V1[Author %in% c("Arthur", "Mario")]:筛选出当前分组中Author为Arthur或Mario的V1值na.rm = TRUE:避免因筛选后无数据出现报错(本例中每组都有这两个作者,可省略,但保留更稳健)- 分组逻辑不变,计算得到的均值会自动填充到当前分组的所有行中
内容的提问来源于stack exchange,提问作者antecessor
相关产品推荐
相关产品推荐

