处理给定数据类型的 NA 的最佳方法
Best way to handle NAs given data type
我正在尝试对 R 中数据框中的 NA 进行重新分类。如果它们是字符值或因子,我希望它们是一个值;如果它们是数字或整数,我希望它们是另一个值。我想出了以下 if 语句,但出于某种原因我要离开了。执行此操作的最佳方法是什么?
for(i in ncol(df_eng)) {
if(class(df_eng[,i]) == "integer") {
is.na(df_eng[,i]) <- 10219300
}
else if(class(df_eng[,i]) == "numeric") {
is.na(df_eng[,i]) <- 10219300
}
else {
is.na(df_eng[,i]) <- "ABCDEF"
}
}
Error in `[<-.data.frame`(`*tmp*`, , i, value = c("2017-05-26 18:20:20", :
replacement has 791 rows, data has 790
有两个问题。一种是 is.na
的赋值错误。假设,我们有一个带有一些 NA 值的向量
v1 <- c(1, 2, NA, 3)
并按照 OP post
中的方式进行作业
is.na(v1) <- 5
v1
#[1] 1 2 NA 3 NA
这会在位置 5 分配一个 NA 元素,类似地
is.na(v1) <- 10
v1
#[1] 1 2 NA 3 NA NA NA NA NA NA
如果预期的行为是用某个值替换 NA 元素,比如 5
v2 <- c(1, 2, NA, 3)
v2[is.na(v2)] <- 5
v2
#[1] 1 2 5 3
其次,循环仅在最后一列循环,即 ncol(df_eng)
将相同的逻辑应用于 OP 的示例代码
for(i in seq_len(ncol(df_eng))) {
if(class(df_eng[,i]) == "integer") {
df_eng[,i][is.na(df_eng[,i])] <- 10219300
} else if(class(df_eng[,i]) == "numeric") {
df_eng[,i][is.na(df_eng[,i])] <- 10219300
} else {
df_eng[,i][is.na(df_eng[,i])] <- "ABCDEF"
}
}
另外,请注意循环卡在 ncol(df_eng)
。它应该是 1:ncol(df_eng)
或更正确的 seq_len(ncol(df_eng))
,如果是 data.frame
,则 seq_along(df_eng)
我正在尝试对 R 中数据框中的 NA 进行重新分类。如果它们是字符值或因子,我希望它们是一个值;如果它们是数字或整数,我希望它们是另一个值。我想出了以下 if 语句,但出于某种原因我要离开了。执行此操作的最佳方法是什么?
for(i in ncol(df_eng)) {
if(class(df_eng[,i]) == "integer") {
is.na(df_eng[,i]) <- 10219300
}
else if(class(df_eng[,i]) == "numeric") {
is.na(df_eng[,i]) <- 10219300
}
else {
is.na(df_eng[,i]) <- "ABCDEF"
}
}
Error in `[<-.data.frame`(`*tmp*`, , i, value = c("2017-05-26 18:20:20", :
replacement has 791 rows, data has 790
有两个问题。一种是 is.na
的赋值错误。假设,我们有一个带有一些 NA 值的向量
v1 <- c(1, 2, NA, 3)
并按照 OP post
中的方式进行作业is.na(v1) <- 5
v1
#[1] 1 2 NA 3 NA
这会在位置 5 分配一个 NA 元素,类似地
is.na(v1) <- 10
v1
#[1] 1 2 NA 3 NA NA NA NA NA NA
如果预期的行为是用某个值替换 NA 元素,比如 5
v2 <- c(1, 2, NA, 3)
v2[is.na(v2)] <- 5
v2
#[1] 1 2 5 3
其次,循环仅在最后一列循环,即 ncol(df_eng)
将相同的逻辑应用于 OP 的示例代码
for(i in seq_len(ncol(df_eng))) {
if(class(df_eng[,i]) == "integer") {
df_eng[,i][is.na(df_eng[,i])] <- 10219300
} else if(class(df_eng[,i]) == "numeric") {
df_eng[,i][is.na(df_eng[,i])] <- 10219300
} else {
df_eng[,i][is.na(df_eng[,i])] <- "ABCDEF"
}
}
另外,请注意循环卡在 ncol(df_eng)
。它应该是 1:ncol(df_eng)
或更正确的 seq_len(ncol(df_eng))
,如果是 data.frame
,则 seq_along(df_eng)