【发布时间】:2021-02-12 07:53:46
【问题描述】:
我正在尝试根据列数据类替换平均 df 列的 NA 值,
我目前正在使用一个 for 循环,但是它不起作用,也没有 向 R 控制台提出任何错误
这是我正在使用的代码:
## data ##
df <- structure(list(
name = c("Bob", "John", "Maria", "Emma", "Greg"),
salary = c(1000.234, 2000.4322, 3000.133, 4000.765, NA),
age = c(NA, NA, 33, 27, 54),
tenure = c(7, 8, NA, NA, NA)),
class = "data.frame",
row.names = c(NA,
-5L))
## for-loop ##
for(i in 1:ncol(df)){
if(class(df[[i]]) == "integer"){
df[is.na(df[,i]), i] <- round(mean(df[,i], na.rm = TRUE),
digits = 0)
}
else if(class(df[[i]]) == "numeric") {
df[is.na(df[,i]), i] <- mean(df[, i], na.rm = TRUE)
}
else {
break
}
}
还有其他方法可以应用这个 for 循环吗?
【问题讨论】:
-
但首先猜测 - 删除
else{break}。break停止循环。您可以使用else{next}进行下一次迭代,但这不是必需的——在循环结束时它会自动进入下一次迭代。如果您想跳过循环的其余部分并直接进入下一个迭代,则使用next。 -
@Gregor Thomas,已经添加了一个结构
-
@Gregor Thomas,我将 break 更改为 next 并出现下一条警告消息:
Warning messages: 1: In if (class(df[[i]]) == "integer") { : la condición tiene longitud > 1 y sólo el primer elemento será usado 2: In if (class(df[[i]]) == "numeric") { : la condición tiene longitud > 1 y sólo el primer elemento será usado -
class() ==是一个糟糕的模式,因为class可以有多个值。将class(df[[i]]) == "integer"替换为is.integer(df[[i]])并将class(df[[i]]) == "numeric"替换为is.numeric(df[[i]]) -
@Gregor Thomas,谢谢它现在可以使用了!
标签: r dataframe class for-loop replace