Использование цикла для определения значений case_when в R - PullRequest
0 голосов
/ 08 октября 2018

В настоящее время я использую case_when для определения новой переменной в моих данных следующим образом:

data[,46] <- NA

data[,46] <- case_when(
   data[,35] ==  1 ~ data[,36],
   data[,35] ==  2 ~ data[,37],
   data[,35] ==  3 ~ data[,38],
   data[,35] ==  4 ~ data[,39],
   data[,35] ==  5 ~ data[,40],
   data[,35] ==  6 ~ data[,41],
   data[,35] ==  7 ~ data[,42],
   data[,35] ==  8 ~ data[,43],
   data[,35] ==  9 ~ data[,44],
   data[,35] ==  10 ~ data[,45]
)

Я пытаюсь написать цикл, чтобы сделать эту функцию более эффективной, но я сталкиваюсь снекоторые проблемыВот что я пытался сделать:

for (j in 1:10) {
data[,46] <- case_when(
   data[,35] ==  j ~ data[,35+j]
)
}

Однако это возвращает NA для всех моих значений данных [, 46].Есть мысли о том, что может пойти не так?Я был бы рад предоставить образцы данных в случае необходимости, но я думаю, что это больше связано с тем, что я совершил простую ошибку в программировании.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Все, что вам нужно сделать, это помнить, что векторизация R.
Вы сравниваете data[, 35] с целыми числами от 1 до 10, и для каждого из них присваиваете data[, 35 + <1 to 10>] обратно data[, 35].Поэтому все, что вам нужно сделать, это

data[, 35] <- data[, 35 + data[, 35]]

Если есть значения в data[, 35], а не в 1:10, тогда ifelse будет более подходящим.

data[, 35] <- ifelse(data[, 35] %in% 1:10, data[, 35 + data[, 35]], data[, 35])
0 голосов
/ 08 октября 2018

Вам может понадобиться [j], как показано ниже, чтобы сохранить его итерацию в data[,46]

for (j in 1:10) {
data[,46][j]<- case_when(
   data[,35] ==  j ~ data[,35+j]
)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...