Предыстория: я использую некоторые образцы микроданных общественного пользования переписи (в частности, исследование американского сообщества) за несколько лет, чтобы изучить поведение людей, получивших разные степени (например, диплом средней школы, степень бакалавра, степень магистра). Переменная с этим файлом общего пользования называется Schooling. Проблема в том, что коды, содержащиеся в переменной Schooling, менялись из года в год. Например, для файлов до 2007 года значение 13 отражает получение степени бакалавра, но начиная с 2008 года значение изменяется на 21, когда кто-то получил степень бакалавра.
Цель: создать новую переменную Degree Competed, которая переводит коды обучения, чтобы отразить полученный уровень с учетом года файла. Логистика: файлы за все годы были объединены, и для целей обзора я должен работать с файлом как есть, а не исправлять его, прежде чем он дойдет до этого момента.
Существующий код: вот что я пробовал.
if (original.file$year %in% c(2000,2001)) {
if (original.file$Schooling <= 08) {original.file$degree.completed <- 0}
else if (original.file$Schooling <= 10) {original.file$degree.completed <- 1}
else if (original.file$Schooling <= 12) {original.file$degree.completed <- 2}
else if (original.file$Schooling == 13) {original.file$degree.completed <- 3}
else if (original.file$Schooling == 14) {original.file$degree.completed <- 4}
else if (original.file$Schooling == 15) {original.file$degree.completed <- 5}
else if (original.file$Schooling == 16) {original.file$degree.completed <- 6}
}
else if (original.file$year %in% c(2002,2003,2004,2005,2006,2007)) {
if (original.file$Schooling <= 08) {original.file$degree.completed <- 0}
else if (original.file$Schooling <= 11) {original.file$degree.completed <- 1}
else if (original.file$Schooling == 12) {original.file$degree.completed <- 2}
else if (original.file$Schooling == 13) {original.file$degree.completed <- 3}
else if (original.file$Schooling == 14) {original.file$degree.completed <- 4}
else if (original.file$Schooling == 15) {original.file$degree.completed <- 5}
else if (original.file$Schooling == 16) {original.file$degree.completed <- 6}
}
else if (original.file$year %in% c(2008,2009,2010,2011)) {
if (original.file$Schooling <= 15) {original.file$degree.completed <- 0}
else if (original.file$Schooling <= 19) {original.file$degree.completed <- 1}
else if (original.file$Schooling == 20) {original.file$degree.completed <- 2}
else if (original.file$Schooling == 21) {original.file$degree.completed <- 3}
else if (original.file$Schooling == 22) {original.file$degree.completed <- 4}
else if (original.file$Schooling == 23) {original.file$degree.completed <- 5}
else if (original.file$Schooling == 24) {original.file$degree.completed <- 6}
}
Проблема: я получаю следующие предупреждающие сообщения этого типа.
Предупреждающие сообщения:
1: В if (original.file $ year% в% c (2000, 2001)) {: длина условия ›1 и будет использоваться только первый элемент
2: В if (original.file $ Schooling ‹= 8) {: длина условия› 1 и будет использоваться только первый элемент
3: В if (original.file $ Schooling ‹= 10) {: длина условия› 1 и будет использоваться только первый элемент
Вопрос: Я знаю, что здесь есть проблема вектора и скаляра с if, как я видел из других вопросов по StackOverflow, но ответы, похоже, не применимы к этой ситуации. Какое здесь решение?
if
действует на одно логическое значение. вместо этого вы можете использоватьifelse
, который действует на векторы, но не подходит для этого. Вы также можете использовать логические условия и подмножества. Что-то вродеdat$degree[dat$year %in% 2000:2001 & dat$schooling <= 8] <- 0
. - person Justin   schedule 31.01.2013