Изменить строки, где столбец начинается с определенных цифр - PullRequest
1 голос
/ 13 марта 2019
df <- data.frame(ID = rep("variable", 9),
                 national_id = rep(-9999, times = 9),
                 state_id = c(rep(-9999, times = 5), 11, 22, 25, -9999),
                 district_id = c(11011, 11201, 22013, 22014, 25016, -9999, -9999, -9999, -9999),
                 d_value = rnorm(9),
                 p_value = rnorm(9))

Я хочу выбрать и добавить 1 к d_value для тех строк, где первые две цифры distict_id равны 11.

Аналогично, я хочу добавить 0,6 (или любое число) d_value для тех строк, где первые две цифры distict_id равны 22.

Кроме того, я хочу добавить 0,6 (или любое число) d_value для тех строк, где первые две цифры district_idэто 22. Я хочу добавить 0,9 к 'd_value для тех строк, где' state_id 'равно 11.

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Похоже на упражнение на подстроку (или RegEx), которое может обрабатывать и база R. Создайте дополнительный (вспомогательный) столбец с первыми 2 цифрами. Здесь решение подстроки.

df$first_2_digits <- substr(x = df$district_id, start = 1, stop = 2)

с последующей "нормальной" индексацией.

df[df$first_2_digits == 11, "d_value"] <- df[df$first_2_digits == 11, "d_value"] + 0.9 

Легко упаковывается в функцию и расширяется с помощью комбинаций из более чем двух цифр и, возможно, функции «переключения».

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

Как упомянуто @markus, это хороший случай для case_when, когда вы можете иметь несколько условий и вывод для этих условий.

library(tidyverse)

df %>%
  mutate(d_value = case_when(str_detect(district_id, "^11") ~ d_value + 1, 
                             str_detect(district_id, "^22") ~ d_value + 0.6, 
                             state_id == 11 ~ d_value + 0.9, 
                             TRUE ~ d_value))

Мы меняем значение d_value на основе указанных условий ис TRUE ~ d_value мы сохраняем d_value как есть, если не выполняется ни одно из вышеуказанных условий.

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