Нахождение даты, когда наступил максимум - PullRequest
0 голосов
/ 13 октября 2019

В приведенном ниже кадре данных можно найти дату, на которую группы достигли максимума

df
Date        Var    Value
27/9/2019    A       56
28/9/2019    A       50
1/10/2019    B       90
2/10/2019    B       100

df1      Max         Date          Mean
A        56        27/9/2019        53
B        100       2/10/2019        95

Ответы [ 3 ]

1 голос
/ 13 октября 2019

Мы можем group_by Var, вычислить mean из Value и выбрать строку с максимальным значением.

library(dplyr)

df %>%
  group_by(Var) %>%
  mutate(Mean = mean(Value)) %>%
  slice(which.max(Value))

#  Date      Var   Value  Mean
#  <fct>     <fct> <int> <dbl>
#1 27/9/2019 A        56    53
#2 2/10/2019 B       100    95
0 голосов
/ 13 октября 2019

Base R, split-apply-Объединить (Отредактировано):

# Create df, ensure date vec has appropriate type: 

df <- data.frame(

  Date = as.Date(c("27/9/2019", "28/9/2019", "1/10/2019", "2/10/2019"), "%d/%m/%y"),

  Var = c("A", "A", "B", "B"), 

  Value = c(56, 50, 90, 100),

  stringsAsFactors = F
)

# Split df by "Var" values: 

split_applied_combined <- lapply(split(df, df$Var), function(x){

# Calculate the max date: 

    max_date <- x$Date[which(x$Value == max(x$Value))]

    # Calculate the mean: 

    mean_val <- mean(x$Value)

    # Calculate the std_dev: 

    sd_val <- sd(x$Value)

   # Combine vects into df: 

    summarised_df <- data.frame(max_date, mean_val, sd_val)

    }
  )

# Combine list back into dataframe:

split_applied_combined <- do.call(rbind, 

                          # Store df name as vect:

                                  mapply(cbind,

                                         "Var" = names(split_applied_combined),

                                         split_applied_combined,

                                         SIMPLIFY = FALSE))

Альтернатива Dplyr:

require("dplyr")

# Group by var, summarise data, store return object as a dataframe: 

summarised_df <- 

  df %>% 

  group_by(Var) %>% 

  summarise(max_date_per_group = max(Date), mean_val_per_group = mean(Value), sd_per_group = sd(Value)) %>% 

  ungroup()
0 голосов
/ 13 октября 2019

Возможно, есть лучший способ сделать это. Так как вы хотите summary, который уменьшает несколько значений до одного значения. Вы можете *_join вывод filter со сводной таблицей следующим образом:

library(dplyr)
df1 <- df %>%
  group_by(Var) %>%
  filter(Value == max(Value)) %>%
  select(df1=Var, Max=Value, Date)

df2 <-df %>%
  group_by(Var) %>%
  summarise_at(.vars = vars(Value),
               .funs = c(mean="mean", sd="sd")) 
df2 %>%
  left_join(df1, by = "Var") %>%
  select(Var, Value, Date, mean, sd)

# -------------------------------------------------------------------------

# # A tibble: 2 x 5
#   Var   Value Date       mean    sd
#   <chr> <dbl> <chr>     <dbl> <dbl>
# 1 A        56 27/9/2019    53  4.24
# 2 B       100 2/10/2019    95  7.07

Данные

df <- data.frame(
  Date = c("27/9/2019", "28/9/2019", "1/10/2019", "2/10/2019"), 
  Var = c("A", "A", "B", "B"), 
  Value = c(56, 50, 90, 100), stringsAsFactors = F
)

Надеюсь, что вы этого хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...