У меня есть набор данных с очень большим количеством строковых столбцовых переменных, представляющих процедурные коды.Есть еще один столбец переменных, который представляет формат кодирования (некоторые из них ICD9, некоторые другие более загадочные форматы).Каждое наблюдение - это пациент.Мне нужно:
- Поиск по каждому имени переменной с определенным префиксом
- Убедитесь, что используемый код является кодом ICD9 (представленным «02»).
- Найдите, какой из этих кодов соответствует первым 3 символам конкретной строки
- Создайте новую переменную столбца = 1, если любая из переменных начинается с этих трех символов, и = 0, если ни одна не соответствует
Слишком много переменных для тривиального создания списка каждой из них вручную через c ("cd1", "cd2", ...), и мне потенциально нужно делать это много разпоэтому я хотел бы сделать это как можно более общим решением.
Вот упрощенный пример, где строки, которые мне нужно найти, начинаются с "231":
ID cd1 type1 cd2 type2 cd3 type3 cd4 type4
1 "231" "02" "219" "02" "1321" "02" "2314" "02"
2 "222" "02"
3 "123" "142"
4 "145" "02" "521" "02" "2313" "02"
5 "231" "01"
Я хотел бы получить следующее:
ID cd1 type1 cd2 type2 cd3 type3 cd4 type4 flag_var
1 "231" "02" "219" "02" "1321" "02" "2314" "02" 1
2 "222" "02" 0
3 "123" "142" 0
4 "145" "02" "521" "02" "2313" "02" 1
5 "231" "01" 0
(ID # 5 установлен в 0, потому что, хотя код cd1 равен «231», переменная type1 равна «01» и, следовательно, не в правильном кодированииformat ")
Я несколько преуспел в этомg mutate и case_when:
df <- df %>%
mutate(flag_var = case_when(
startsWith(cd1, "231") ~ 1,
startsWith(cd2, "231") ~ 1,
startsWith(cd3, "231") ~ 1,
startsWith(cd4, "231") ~ 1,
TRUE ~ 0))
Как я уже говорил, фактический набор данных имеет слишком много переменных и потенциальных поисков, чтобы иметь смысл жестко закодировать его описанным выше способом.Я думаю, что должен быть хороший способ сделать это, используя mutate_at или другую функцию dplyr, но я не смог понять это.
Мне удалось использовать следующий код, чтобы получить набор новых переменных, равный 1 или 0, но не одну переменную.Затем я могу использовать rowSums для суммирования по всем столбцам и проверить, является ли это значение ненулевым.Но это уродливо и кропотливо:
df <- df %>% mutate_at(vars(starts_with("cd")),
funs(testvar = ifelse(startsWith(., "231"), 1, 0)))
test_names = df %>% select(ends_with("_testvar")) %>% names()
df <- df %>% mutate(flag_var = (rowSums(.[test_names]) == 1))
df <- df %>% select(-ends_with("_testvar"))
У кого-нибудь есть более простые идеи?Большое спасибо!
РЕДАКТИРОВАТЬ: я понял, что я также должен включить переменные типа кодирования.Исходные таблицы данных образцов были отредактированы, чтобы отразить это.