I have this data frame:
library(dplyr)
library(tidyr)
data <- tribble(
~Date, ~A1, ~A2,~B1,~B2,
as.Date("2019-01-01"), 20, 10,20, 10,
as.Date("2019-01-01"), 20 ,5,20,5,
as.Date("2019-01-01"), 10, 2,10,20,
as.Date("2019-01-01"), 20, 60,0,0,
as.Date("2019-01-01"), 30, 4,20,5,
as.Date("2019-02-01"), 0, 0,16,8,
as.Date("2019-02-01"), 0, 0,0,40,
as.Date("2019-02-01"), 0, 0,4,2,
as.Date("2019-02-01"), 4, 8,10,6,
as.Date("2019-02-01"), 6, 3,0,0,
as.Date("2019-03-01"), 20, 8,23,9,
as.Date("2019-03-01"), 60, 4,0,0,
as.Date("2019-03-01"), 4, 2,8,3,
as.Date("2019-03-01"), 0, 6,10,0
)
对于每一天,我想计算(A1-B1)和(A2-B2)的平均值。
对于A1-B1,我只想使用A1>B1且A1>0,B1>0的行。
对于A2-B2,我只想使用A2>B2且A2>0,B2>0的行。
这是我尝试过的:
data_mean = data %>%
group_by(Date) %>%
dplyr::summarise(
mean_1 = mean(A1[A1>=B1 & A1>0 & B1>0] - B1[A1>=B1 & A1>0 & B1>0]),
mean_2 = mean(A2[A2>=B2 & A2>0 & B2>0] - B2[A2>=B2 & A2>0 & B2>0]))
有没有一种方法可以在使用summarise函数时使用filter函数?或者有更聪明的方法来应用我的代码吗?
packageVersion('dplyr')
吗?我使用了packageVersion('dplyr') [1] ‘1.0.4’
。 - akrunmap
,那么可能要使用以下代码:data %>% select(-Date) %>% split.default(str_remove(names(.), '\\D+')) %>% map_dfr(~ .x %>% bind_cols(., Date = data$Date) %>% filter(.[[1]] >= .[[2]] & if_all(-Date, ~ . > 0)) %>% group_by(Date) %>% summarise(mean = mean(cur_data()[[1]] - cur_data()[[2]])) ) %>% complete(Date = unique(data$Date))
- akrun|
会增加元素。我想我得注意一下这个问题。非常好的观点,谢谢。 - Anoushiravan Rfilter
步骤中有一个日期被删除了。通过使用complete
,可以恢复数据中的原始唯一日期,并且该日期显示为 NA,对应于 mean 值。 - akrun