read.csv 中的 na.string 和 dplyr::mutate 中的 ifelse 函数
na.string in read.csv and ifelse function in dplyr::mutate
我使用了两种方法将数据(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
的 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")
原因是对于第二种情况而不是空白,我们有 NA
。如果我们使用 ==
,NA 值将保持不变。要将这些值设置为 FALSE,请使用 &
和 !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]
我使用了两种方法将数据(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
的 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")
原因是对于第二种情况而不是空白,我们有 NA
。如果我们使用 ==
,NA 值将保持不变。要将这些值设置为 FALSE,请使用 &
和 !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]