Как я могу получить построчный максимум на основе состояния конкретного столбца в R-кадре данных? - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь получить максимальное значение BY ROW для нескольких столбцов (климатический дефицит воды - def_59_z_#) в зависимости от того, сколько времени прошло (время с момента пожара - YEAR.DIFF).Вот условия:

  • Если прошел 1 год, выберите значение дефицита для первого года.(def_59_z_1).
  • Если 2 года: максимальный дефицит первых 2 лет.
  • Если 3 года: максимальный дефицит первых 3 лет.
  • Если 4 года: максимум дефицита в первые 4 года.
  • Если 5 или более лет: максимум в первые 5 лет.

Однако я не могу извлечьпострочно макс, когда я включаю условие.Существует несколько существующих постов, в которых рассматриваются построчно мин и макс (примеры 1 и 2 ) и sd (пример 3 ) - но это не такУсловия использования.Я попытался использовать apply, но мне не удалось найти решение, когда у меня есть несколько столбцов, а также условное требование.

Следующий код просто возвращает 3,5 в новом столбце def59_z_max15, что является максимальным значением, которое встречается в кадре данных - , за исключением , когда YEAR.DIFF равно 1, в этом случае def_50_z_1 возвращается напрямую.Но для всех остальных условий мне нужны 0,98, 0,67, 0,7, 1,55, 1,28 - значения, которые отражают максимум строки указанных столбцов.Ссылка на пример данных здесь .Как мне этого добиться?

Я ценю любые / все предложения!

data <- data %>%
mutate(def59_z_max15 = ifelse(YEAR.DIFF == 1,
                            (def59_z_1),
                            ifelse(YEAR.DIFF == 2,
                                   max(def59_z_1, def59_z_2),
                                   ifelse(YEAR.DIFF == 3,
                                          max(def59_z_1, def59_z_2, def59_z_3),
                                          ifelse(YEAR.DIFF == 4,
                                                 max(def59_z_1, def59_z_2, def59_z_3, def59_z_4),
                                                 max(def59_z_1, def59_z_2, def59_z_3, def59_z_4, def59_z_5))))))

Ответы [ 2 ]

1 голос
/ 15 мая 2019

Можно было бы получить pmax (строка max - векторизация) для каждого набора условий отдельно в цикле (map - если значение 'YEAR.DIFF' равно 1, выберите только'def_59_z_1', для 2, получить максимум из 'def_59_z_1' и 'def_59_z_2', ..., для 5, максимум из 'def_59_z_1' в 'def_59_z_5', coalesce вместе столбцы и заменить остальные из NA с pmax всех столбцов def59_z

library(tidyverse)
out <- map_dfc(1:5, ~
         df1 %>% 
           select(seq_len(.x) + 1) %>% 
           transmute(val = na_if((df1[["YEAR.DIFF"]] == .x)*
               pmax(!!! rlang::syms(names(.))), 0))) %>%  
  transmute(def59_z_max15 = coalesce(!!! rlang::syms(names(.)))) %>%
  bind_cols(df1, .)%>%
  mutate(def59_z_max15 = case_when(is.na(def59_z_max15) ~ 
         pmax(!!! rlang::syms(names(.)[2:6])), TRUE ~ def59_z_max15))
head(out, 10)
#   YEAR.DIFF def59_z_1 def59_z_2 def59_z_3 def59_z_4 def59_z_5 def59_z_max15
#1          5      0.25     -2.11      0.98     -0.07      0.31          0.98
#2          9      0.67      0.65     -0.27      0.52      0.26          0.67
#3         10      0.56      0.33      0.03      0.70     -0.09          0.70
#4          2     -0.34      1.55     -1.11     -0.40      0.94          1.55
#5          4      0.98      0.71      0.41      1.28     -0.14          1.28
#6          3      0.71     -0.17      1.70     -0.57      0.43          1.70
#7          4     -1.39     -1.71     -0.89      0.78      1.22          0.78
#8          4     -1.14     -1.46     -0.72      0.74      1.32          0.74
#9          2      0.71      1.39      1.07      0.65      0.29          1.39
#10         1      0.28      0.82     -0.64      0.45      0.64          0.28

data

df1 <- read.csv("https://raw.githubusercontent.com/CaitLittlef/random/master/data.csv")
1 голос
/ 15 мая 2019

Бросьте эту функцию в семейную функцию apply

func <- function(x) {
first.val <- x[1]
if (first.val < 5) {
return(max(x[2:(first.val+)])
} else {
return(max(x[2:6]))
}
}

Ваш желаемый результат должен быть получен:

apply(data, 1, function(x) func(x)) #do it by row by setting arg2 = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...