na.string в read.csv и функция ifelse в dplyr::mutate

Я использовал 2 способа импортировать данные (в формате CSV) в R. Первый метод не имеет na.string аргумент, а второй имеет. Я использовал второй, потому что некоторые строки выглядели как "" вместо NA после импорта, и что я хочу стандартизировать все отсутствующие значения как NA,

data1<-read.csv("file.csv",stringsAsFactors=FALSE)
data2<-read.csv("file",stringsAsFactors=FALSE,na.string="")

У меня есть 3 переменные, которые являются показателями. Они дают "X" да и ""/NA для нет. Я пытался применить следующую функцию к обоим data1 а также data2 выше.

df1<-data1%>%
     mutate(Indicator_Institution=ifelse(Indicator_A=="X",1,
                                  ifelse(Indicator_B=="X",2,
                                  ifelse(Indicator_C=="X",3,NA))))
df2<-data2%>%
     mutate(Indicator_Institution=ifelse(Indicator_A=="X",1,
                                  ifelse(Indicator_B=="X",2,
                                  ifelse(Indicator_C=="X",3,NA))))

df1"s ifelse Функция прошла все условия, в то время как df2 только запустить первое условие. Есть идеи почему? Какая разница, аргумент na.string="" делать?

Воспроизводимый пример:

    > dput(droplevels(head(data1)))
structure(list(Indicator_A = c("X", "X", "X", "X", "", ""), 
    Indicator_B = c("", "", "", "", "X", "X"), Indicator_C = c("", 
    "", "", "", "", "")), .Names = c("Indicator_A", "Indicator_B", 
"Indicator_C"), row.names = c(NA, 6L), class = "data.frame")

> dput(droplevels(head(data2)))
structure(list(Indicator_A = c("X", "X", "X", "X", NA, NA), 
    Indicator_B = c(NA, NA, NA, NA, "X", "X"), Indicator_C = c(NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_)), .Names = c("Indicator_A", "Indicator_B", 
"Indicator_C"), row.names = c(NA, 6L), class = "data.frame")

1 ответ

Решение

Причина в том, что для второго случая вместо пробелов мы имеем NA, Если мы используем ==значения NA останутся как таковые. Чтобы сделать эти значения как ЛОЖНЫЕ, используйте & с !is.na

data2 %>% 
    mutate(Indicator_Institution = ifelse(Indicator_A == "X" & !is.na(Indicator_A), 1, 
                                   ifelse(Indicator_B=="X" & !is.na(Indicator_B), 2,
                                   ifelse(Indicator_C == "X" & !is.na(Indicator_C), 3, 
                  NA))))

На основе приведенного примера это можно легко сделать с помощью which

which(!is.na(data2), arr.ind=TRUE)[,2]
Другие вопросы по тегам