Создать новую переменную на основе условия из таблицы данных dplyr одного столбца - PullRequest
0 голосов
/ 02 марта 2019

Пример данных:

Group <- c("a", "a", "a", "b", "b", "b", "c", "c", "c")    
value_1 <- c(1.10, 2.5, 1.7, 0.99, 1.50, 1.65, 2.5, 2.5, 1.5)
value_2 <- c(0.03, 1.3, 3.5, 0.02, 4.3, 1.2, 1.4, 1.4, 3.7)
new_variable_1 <- c(1,0,1, 1,1,0, 0,0,1)    
df <- data.frame(Group, value_1, value_2, new_variable_1)

Выход new_variable_1.Я хочу создать new_variable_1 на основе следующих критериев; Я ищу 2 решения.

Основная идея:

поиск максимального значения в value_2 по группам и создание фиктивной переменной на основе значений в value_1.

решение 1 Логика:

  1. Найти max(value_2) по группам.Например, максимальное значение в value_2 для группы a равно 3.5

  2. Найти соответствующий value_1 по группе.Например, value_1 равно 1.7 в группе a

  3. создать new_variable_1 по группе, равной 1, если value_1 меньше соответствующего значения в приведенном вышешаг.Например, для группы a, value_1 <= 1.7 должно показывать 1 и value_1 > 1.7 должно показывать 0.

решение 2 Логика:

То же, что и выше, но увеличить пороговое значение с шага 2 на 10%.

  1. максимальное значение в value_2 для группы a равно 3.5

  2. , а затем соответствует значению 1.7 value_1 в группе a

  3. Увеличить значение на 10%.Для группы a 10% увеличение составит 1.87.

  4. Создать new_variable_1: для группы a value_1 <= 1.87 должно показать 1 & value_1 > 1.87 должно показать 0.

R, dplyr, data.table и наиболее эффективные коды R приветствуются.

Это большой набор данных, поэтому группы могут иметь разную длину и Inf или NA могут существовать в value_2.

1 Ответ

0 голосов
/ 02 марта 2019

Мы могли бы попробовать.Я использовал имена, начинающиеся с «Новый», чтобы упростить отслеживание.

Решение 1 (благодаря @Gregor):

library(dplyr)


 df %>% 
  group_by(Group) %>%  
  mutate(New_variable_1 = ifelse(value_1 <= value_1[which.max(value_2)], 1, 0))

Решение 2: Благодаря @ Gregor

df %>% 
  group_by(Group) %>%  
  mutate(New_variable_1 = ifelse(value_1 <= value_1[which.max(value_2)], 1, 0),
         NewVar1=value_1[which.max(value_2)]*1.1)
...