Как создать несколько переменных, используя ifelse, основываясь на совпадении имен других переменных? - PullRequest
1 голос
/ 04 июня 2019

Я действительно изо всех сил пытался сформулировать свой вопрос, так что на самом деле это может быть проблема, отличная от того, что предлагает название!У меня есть датафрейм с 6 факторами.Имена переменных:

var_1_1
var_1_2
var_2_1
var_2_2
var_3_1
var_3_2

Для всех переменных, заканчивающихся на 1, уровнями являются «Да», «Нет» и «Не знаю».Все переменные, оканчивающиеся на два, имеют два уровня - «Да» и «Нет».

Там, где совпадают первые 5 символов имен переменных, я хочу создать новую переменную, которая объединит «Да» и «Нет».Уровни двух полусогласованных переменных.Таким образом, в итоге я получу в общей сложности 9 переменных, например:

var_1_1
var_1_2
var_1_3
var_2_1
var_2_2
var_2_3
var_3_1
var_3_2
var_3_3

Моей первой мыслью было сделать 3 оператора ifelse для получения новых переменных, но я пытаюсь уменьшить количество повторений в своем коде.Я думаю, что это можно сделать с помощью цикла for или apply, но я очень запутался, пытаясь это сделать.Будем очень благодарны за любые предложения!

Вот как я изначально собирался это сделать, но подумал, что, возможно, есть способ сделать это менее повторяющимся ...

df$var_1_3 <- ifelse(df$var_1_1=="Yes" | df$var_1_2=="Yes","Yes","No") 

df$var_1_3 <- as.factor(df$var_1_3)

1 Ответ

0 голосов
/ 04 июня 2019

Можно было бы разбить набор данных на список на основе подстроки в именах столбцов

grp <- sub("_\\d+$", "", names(df1))
#or
#grp <- substr(names(df1), 1, 5)
lst1 <- split.default(df1, grp)

Прокрутите list и создайте «Да / Нет»

nm1 <- paste0(names(lst1), "_3")
df1[nm1] <- lapply(lst1, function(x) c("No", "Yes")[(rowSums(x == "Yes") > 0) + 1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...