Как вытащить значения из нескольких столбцов, условно, в новый столбец? - PullRequest
1 голос
/ 16 марта 2020

Я относительно начинающий пользователь R, хотя и знаком с dplyr и tidy verse. Я все еще не могу понять, как вытащить фактические данные из одного столбца, если он удовлетворяет определенному условию, в новый столбец.

Вот что я пытаюсь сделать. Участники оценили конкретные c практики (n = 5) и предоставили ответы на вопросы, которые отражают их мнение об этих практиках. Я хочу иметь пять новых столбцов, которые присваивают их представления о методах, а не практиках.

Например, у них есть оценка «убеждений о NI», называемая ni.beliefs, если участник оценил NI как свой первый выбор, я хочу, чтобы значение для ni.beliefs было перенесено в новый столбец для first.beliefs. То же самое верно, что если участник выбрал pmii в качестве практики первого выбора, его значение для pmii.beliefs должно быть указано в столбце first.beliefs.

Итак, мне нужно пять новых столбцов, которые называются: first.beliefs, second.beliefs, third.beliefs, четвертые. Верования, last.beliefs, а затем мне нужно, чтобы каждый из них получал данные, условно извлекаемые из специфика практики c убеждения (ni.beliefs, dtt.beliefs, pmi.beliefs, sn.beliefs, script.beliefs), зависящие от специфики практики c ранги (ранг, присвоенный 1-5 для каждой практики, rank.ni , rank.dtt, rank.pmi, rank.sn, rank.script).

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

`

Diss$first.beliefs <-ifelse(rank.ni==1, ni.beliefs,
                    ifelse(rank.dtt==1, dtt.beliefs,
                           ifelse(rank.pmi==1, pmi.beliefs,
                                  ifelse(rank.sn, sn.beliefs,
                                         ifelse(rank.script==1, script.beliefs)))))

`

Спасибо !!

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Я не уверен, правильно ли я понял (было бы полезно, если бы вы показали, как выглядят ваши данные), но я думаю:

Без использования дополнительных пакетов, если столбцы ранжирования эквивалентны индексу новых столбцов, которые вы хотите (т.е. они ранжируют каждую практику от 1 до 5, без повторов и в том же порядке, что и новые столбцы «первое убеждение, второе убеждение и т. д. c»), затем вы можно использовать эти данные в качестве индексов для второго набора столбцов:

for(j in 1:nrow(people_table)){
people_table[j,]$first.belief[[1]] <- names(beliefs)[(people_table[j,c(A:B)]) %in% 1]
people_table[j,]$second.belief[[1]] <- names(beliefs)[(people_table[j,c(A:B)]) %in% 2]
...
}

Где

A -> index of the first preference rank column

B -> index of the last preference rank column

(people_table[j,c(A:B)] %in% 1) -> this returns something like (FALSE FALSE TRUE FALSE FALSE)

beliefs -> vector with the names of each belief

Это должно работать. Это просто, не нужно пакетов, и это будет быстро. Просто убедитесь, что вы сначала инициализировали / создали новые столбцы, иначе вы получите некоторые ошибки. Если

0 голосов
/ 16 марта 2020

Это очень легко сделать с помощью функции case_when (). Вы можете улучшить код ниже.

library(dplyr)

Diss$first.beliefs <- case_when(
  rank.ni == 1 ~ ni.beliefs,
  rank.dtt == 1 ~ dtt.beliefs,
  rank.pmi == 1 ~ pmi.beliefs,
  rank.sn ~ sn.beliefs,
  rank.script == 1 ~ script.beliefs
)
...