表示基于另一列的条件

时间:2017-12-19 08:51:34

标签: r

我有这样的数据:

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时,我没有考虑DERP的值。

我想不出如何结合这个。 如果我尝试使用filter并过滤掉RP并仅选择value >=17,那么我将丢失MEDE的信息。

因此,例如,ME的平均值是(NAN + 1 + 4)/ 2。 DE的平均值为(20 + 2 + 43)/ 3.

2 个答案:

答案 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