Подстановка фрейма данных с несколькими одновременными условиями в R - PullRequest
1 голос
/ 27 марта 2020

Это репрезентативное подмножество моих данных:

> df
  Sample  Circle      Value
1     a1     C27 0.04829484
2     a2     C27 0.10577841
3     a1     C18 0.03977222
4     a2     C18 0.10319845
5     a1     C16 0.03977222
6     a2     C16 0.03095953

Я хотел бы:

1) рассчитать максимальное значение $ Value для каждого круга. Всего три круга, поэтому я получу 3 максимальных значения. Я использовал:

Max_df = df %>% group_by(Circle) %>% do(data.frame(Max_value = max(.$Value)))

> Max_df
# A tibble: 3 x 2
# Groups:   Circle [3]
  Circle  Max_value
  <chr>       <dbl>
1 C18        0.10319845 
2 C27        0.10577841 
3 C16        0.03977222

Так что он работает, но не сохраняет информацию о том, какое значение $ Sample (a1 или a2) имеет максимальное значение. Вы бы знали, как это сделать?

2) вычислите второе максимальное значение для каждого круга. Я не могу использовать min(), потому что в моем реальном наборе данных гораздо больше образцов и кругов. Я попытался отфильтровать строки с максимальными значениями df, используя Max_df. А затем рассчитать максимальные значения этого отфильтрованного df. Так что это будет тот же код, что и в 1).

Однако мне не удается отфильтровать строки с максимальными значениями, сохраненными в Max_Df. Я попытался:

filter(df, Circle %in% Max_df$Circle & Value %in% Max_df$Max_Value)

Проблема заключается в том, что этот код сохраняет третью строку df, поскольку его значение равно максимальному значению C16 (строка 5). Принимая во внимание, что третья строка абсолютно не является максимальным значением круга C18.

Итак, как мне отфильтровать таблицу по двум условиям одновременно?

1 Ответ

1 голос
/ 27 марта 2020

Попробуйте это filter() решение:

library(dplyr)

#given dataset
df <- data.frame(Sample = rep(c("a1", "a2"), 3),
                 Circle = c("C27", "C27", "C18", "C18", "C16", "C16"),
                 Value = c(0.04829484, 0.10577841, 0.03977222,
                           0.10319845, 0.03977222, 0.03095953))

#(1)
Max_df <- df %>%
  group_by(Circle) %>%
  filter(Value == max(Value))

#(2)
Second_df <- df %>%
  group_by(Circle) %>%
  filter(Value != max(Value)) %>%
  filter(Value == max(Value))

#(1+2)
Both_df <- Max_df %>%
  rbind(Second_df)

Или это rank() решение

#Adding ranks to df
Rank_df <- df %>%
  group_by(Circle) %>%
  mutate(Value_rank = rank(-Value, ties.method = "first")) 

#(1)
Max_df2 <- Rank_df %>%
  filter(Value_rank == 1) %>%
  select(-Value_rank)

#(2)
Second_df2 <- Rank_df %>%
  filter(Value_rank == 2) %>%
  select(-Value_rank)

#(1+2) - step (1) and (2) are not required
Both_df2 <- Rank_df %>%
  filter(Value_rank %in% 1:2) %>%
  select(-Value_rank)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...