Я новичок в программировании на R. Я прочитал csv файл. Я хочу заменить определенные значения «NA» в столбце значениями, представленными в той же строке из другого столбца. Итак, я написал оператор if, показанный ниже, но вместо замены только значений «NA» все значения в этом столбце заменяются значениями из другого столбца. Что здесь может быть не так? Любая помощь приветствуется. Данные выглядят так
Group Skill
A1 ABC
A1 ABC
A1 ABC
A1 ABC
A1
A1
A1
A1
Желаемый результат
Group Skill
A1 ABC
A1 ABC
A1 ABC
A1 ABC
A1 A1
A1 A1
A1 A1
A1 A1
Результат, который я получаю сейчас
Group Skill
A1 A1
A1 A1
A1 A1
A1 A1
A1 A1
A1 A1
A1 A1
A1 A1
Я написал оператор if:
df<- read.csv("Data.csv",header=T,na.strings=c(""))
if (is.na(df$Skill)) {
df$Skill <- df$Group
}
Один из вариантов - использовать функцию coalesce
из пакета dplyr
:
require(dplyr)
df$Skill = coalesce(df$Skill, df$Group)
Для строк, в которых Skill
имеет значение, отличное от NA
, значение останется без изменений. В противном случае NA
будет заменен тем, что указано в столбце Group
.
Привет, @Tim Biegeleisen Спасибо за ответ. Но после того, как я запустил 2 строки, которые вы упомянули выше, в консоли появилось предупреждающее сообщение: «Предупреждающее сообщение: в [<-.factor
(*tmp*
, i, value = c (1L, 1L, 1L, 1L, 1L, 1L, 1L). ,: недопустимый уровень фактора, сгенерировано NA "И столбец df $ Skill все еще тот же, с некоторыми значениями и некоторыми значениями 'NA'
Это было бы решение с базовым подмножеством R:
df$Skill[is.na(df$Skill)] <- df$Group[is.na(df$Skill)]
Или с dplyr:
library(dplyr)
df %>% mutate(Skill = ifelse(is.na(Skill, Group, Skill))
Он принимает значение Group, если Skill имеет значение NA, и значение Skill, если значение Skill существует.
ifelse(is.na(df$Skill), df$Group, df$Skill)