表示基于另一列的条件

问题描述 投票:-1回答:2

我有这样的数据:

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。

r
2个回答
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
投票
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))

qazxsw poi返回RUPEE大于17的所有时间戳。然后我按这些日期过滤数据帧,按名称分组并计算平均值。

结果:

df$Date[df$Name == "RP" & df$Value >= 17]

受@ kath's anwer的启发,我建议通过扩展数据帧来转换数据帧的格式

> mean_df
# A tibble: 3 x 2
   Name    means
  <chr>    <dbl>
1    DE 21.66667
2    ME  2.50000
3    RP 35.66667

如果你不需要它,你可以放弃RP列

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
© www.soinside.com 2019 - 2024. All rights reserved.