【问题标题】:Replacing NA for mean df column by using a for-loop not working and not raising any error in R通过使用for循环替换平均df列的NA不起作用并且不会在R中引发任何错误
【发布时间】: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 &gt; 1 y sólo el primer elemento será usado 2: In if (class(df[[i]]) == "numeric") { : la condición tiene longitud &gt; 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


【解决方案1】:
for(i in 1:ncol(df)) {
  if (is.integer(df[[i]])) {
    df[is.na(df[[i]]), i] <- round(mean(df[[i]], na.rm = TRUE), digits = 0)
  }
  else if(is.numeric(df[[i]])) {
    df[is.na(df[[i]]), i] <- mean(df[[i]], na.rm = TRUE)
  }
}

df
#    name   salary age tenure
# 1   Bob 1000.234  38    7.0
# 2  John 2000.432  38    8.0
# 3 Maria 3000.133  33    7.5
# 4  Emma 4000.765  27    7.5
# 5  Greg 2500.391  54    7.5

【讨论】:

    猜你喜欢
    • 2021-01-11
    • 2021-02-26
    • 2021-08-09
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2011-07-21
    • 2021-07-31
    • 1970-01-01
    相关资源
    最近更新 更多