我有这样的数据:
Date Value Name
17/12/17 8:39:00 NAN ME
17/12/17 8:39:00 20 DE
17/12/17 8:39:00 30 RP
17/12/17 8:40:00 33 ME
17/12/17 8:40:00 39 DE
17/12/17 8:40:00 5 RP
17/12/17 8:41:00 1 ME
17/12/17 8:41:00 2 DE
17/12/17 8:41:00 32 RP
17/12/17 8:42:00 4 ME
17/12/17 8:42:00 43 DE
17/12/17 8:42:00 45 RP
当ME
的值>> = 17时,我想计算RP
的平均值。
然后,当DE
的值> = 17时,RP
的平均值。
因此,当ME
的值<17时,我没有考虑DE
,RP
的值。
我想不出如何结合这个。
如果我尝试使用filter
并过滤掉RP
并仅选择value >=17
,那么我将丢失ME
或DE
的信息。
因此,例如,ME
的平均值是(NAN + 1 + 4)/ 2。
DE
的平均值为(20 + 2 + 43)/ 3.
答案 0 :(得分:1)
在这种情况下,您可以更轻松地使用各种数据格式。因此,首先我使用spread
,然后filter
使用您的标准,最后使用summarize
来获得均值。
library(tidyverse)
df <- df %>%
spread(Name, Value) %>%
mutate_at(c("ME", "DE", "RP"), as.numeric)
df
# Date DE ME RP
# 1 17/12/17 8:39:00 20 NaN 30
# 2 17/12/17 8:40:00 39 33 5
# 3 17/12/17 8:41:00 2 1 32
# 4 17/12/17 8:42:00 43 4 45
df %>%
filter(RP >= 17) %>%
summarize(ME_mean = mean(ME),
DE_mean = mean(DE))
# ME_mean DE_mean
# 1 NaN 21.66667
答案 1 :(得分:1)
library(dplyr)
library(magrittr)
df %<>% filter(df$Date %in% df$Date[df$Name == "RP" &
df$Value >= 17]) %>% group_by(Name)
mean_df <- summarize(df, means = mean(Value, na.rm = T))
df$Date[df$Name == "RP" & df$Value >= 17]
返回RP大于17的所有时间戳。然后我按这些日期过滤数据帧,按名称分组并计算平均值。
结果:
> mean_df
# A tibble: 3 x 2
Name means
<chr> <dbl>
1 DE 21.66667
2 ME 2.50000
3 RP 35.66667
受@ kath's anwer的启发,我建议通过展开来转换数据框的格式
mean_df %<>% spread(Name, means)
> mean_df
# A tibble: 1 x 3
DE ME RP
* <dbl> <dbl> <dbl>
1 21.66667 2.5 35.66667
如果你不需要它,你可以删除RP列
mean_df <- mean_df[ , !(names(mean_df) %in% "RP")]
> mean_df
# A tibble: 1 x 2
DE ME
<dbl> <dbl>
1 21.66667 2.5