как дальше манипулировать списком, созданным из group_map () в R dplyr - PullRequest
1 голос
/ 27 февраля 2020

Я довольно плохо знаком с R и использую старую школу для -l oop. Я пытаюсь кодировать более эффективно, используя dplyr, чтобы ускорить обработку моих данных, но я когда-либо путаюсь со списками. У меня есть простой набор данных ниже:

df <- data_frame(group = sort(rep(1:3, 20)), 
                  values = signif(runif(60), 2),
                  thresh = ifelse(values > 0.6, TRUE, FALSE))

df %>% group_by(group) %>% group_map(~which(.$thresh == TRUE))

Из вывода group_map() выше, как мне, 1.) создать новый столбец, который содержит имена строк только thresh == TRUE, а остальные NA и 2.) создайте еще один столбец, который содержит максимальное значение среди ИСТИННЫХ значений из thresh. Чтобы проиллюстрировать это, я хочу, чтобы мой окончательный кадр данных был примерно таким:

   group values  thresh idex  max
 1     1 0.77    TRUE    1    NA
 2     1 0.32    FALSE   NA   NA
 3     1 0.06    FALSE   NA   NA
 4     1 0.33    FALSE   NA   NA
 5     1 0.51    FALSE   NA   NA
 6     1 0.053   FALSE   NA   NA
 7     1 0.92    TRUE    7    0.92
 8     1 0.44    FALSE   NA   NA
...
...

Я думал о создании кода, но застрял после group_map:

dff %>% group_by(group) %>% 
  group_map(~which(.$thresh == TRUE)) %>%
  mutate(idex = *row_names_in_the_column_blank_are_NA*,
         max = max(*values_from_the_indices*))

Что такое лучший способ сделать это? Спасибо!

1 Ответ

0 голосов
/ 27 февраля 2020

Вы можете сделать:

library(dplyr)

df %>% 
  #For each group
  group_by(group) %>% 
         #Give row number to TRUE thresh values and NA to FALSE thresh values
  mutate(idex = replace(row_number(), !thresh, NA), 
         #Get maximum of values where thresh == TRUE
         max_v = max(values[thresh],na.rm = TRUE), 
         #Replace values to NA where the value is not maximum. 
         max_v = replace(max_v, max_v != values, NA))

Вот способ заставить его работать с group_map

df %>%
  bind_cols(df %>% group_by(group) %>% group_map(~{
            tibble(idex = replace(seq_along(.x$thresh), !.$thresh, NA), 
                   max_v1 = max(.x$values[.x$thresh],na.rm = TRUE), 
                   max_v = replace(max_v1, max_v1 != .x$values, NA)) %>%
             select(-max_v1)
             }) %>%
             bind_rows())
...