Попробуйте векторизовать его и использовать оператор ifelse
:
employ.data <- data.frame(employee, salary, startdate, stringsAsFactors = F)
employ.data["missing"] = with(employ.data, ifelse(is.na(startdate), employee, NA))
employ.data
employee salary startdate missing
1 John Doe 21000 2010-11-01 <NA>
2 Peter Gynn NA <NA> Peter Gynn
3 Jolie Hope 26800 2007-03-14 <NA>
В качестве альтернативы, чтобы проверить все столбцы, используйте any
:
employ.data <- data.frame(employee, salary, startdate, stringsAsFactors = F)
employ.data["something_missing"] = apply(employ.data, 1, function(x) any(is.na(x)))
employ.data
employee salary startdate something_missing
1 John Doe 21000 2010-11-01 FALSE
2 Peter Gynn NA <NA> TRUE
3 Jolie Hope 26800 2007-03-14 FALSE
Конструкция выше даствы булевыЕсли вы хотите получить столбец имен, вы можете объединить его с ifelse
.
На более общей ноте: сначала создавать экземпляр столбца, а затем циклически перебирать фрейм данных, чтобы заполнить его, не особенно Rtistic
, и я бы предложил по возможности избегать этой стратегии.apply
-семейство функций очень мощное, и ifelse
тоже.dplyr
mutate
в сочетании с case_when
статистиками также можно использовать в случае, если вы хотите что-то более похожее на SQL.
Просто по педагогическим причинам, вот ваш код в рабочей версии.Пожалуйста, не используйте его, просто попытайтесь понять различия.
employ.data$missing = NA
for (i in 1:nrow(employ.data)) {
if (is.na(employ.data$startdate[i])){
employ.data$missing[i] <- employ.data$employee[i]
}
}
Важно отметить, что "NA"
интерпретируется как строка.Чтобы проверить, является ли значение NA
, вам нужно использовать, например, is.na
.В конце концов, тестирование 42 == NA
неоднозначно.Значение отсутствует.Может быть или не быть равным 42, поэтому тест вернет NA
.