【问题标题】:Replace NA in all columns: argument is not numeric or logical替换所有列中的 NA:参数不是数字或逻辑
【发布时间】:2022-08-03 23:01:04
【问题描述】:

我想遍历 r 数据框中的很多列,并将 NA 替换为列均值。

我可以得到这样的列的平均值

mean(df$col20, na.rm = TRUE)

但这会得到警告:参数不是数字或逻辑:返回 NA

mean(df[ , 20], na.rm = TRUE)

我用一个包含一些 NA 的小虚拟 df 尝试了上述语法,它工作正常。知道还有什么可以解决这个问题吗?

附言。 head(df[20]) 告诉我它是一个 dbl,而 str(df) 说它是 num。

(并且 [ , 20] 是一个例子;我实际上收到了很多警告,因为它确实位于 for 循环中 - 但我已经单独执行了该行作为测试)

  • 如果列不是数字,则平均值没有意义......
  • 如果您的df 是一个小标题,那么用方括号 ([) 将其子集将返回一个小标题,您无法直接在小标题上计算 mean
  • 列中有字符。 mean(as.numeric(df$col20), na.rm = TRUE) 会得到正确的结果。
  • 如果你正在循环,那么你可以做mean(df[[20]],na.rm=TRUE) where [[总是返回包含tibbledata.frame 的单列; [\ 的行为(正如 benson23 敏锐地指出的那样)是不一致的。

标签: r


【解决方案1】:

1)创建一个逻辑向量ok,对于每个数字列为 TRUE,对于其他列为 FALSE。然后在数字列上使用na.aggregate

library(zoo)
df <- data.frame(a = c(1, NA, 2), b = c("a", NA, "b")) # test data


ok <- sapply(df, is.numeric)
replace(df, ok, na.aggregate(df[ok]))

给予:

    a    b
1 1.0    a
2 1.5 <NA>
3 2.0    b

2)或者使用 dplyr。 df 来自上方,输出相同。

library(dplyr)
library(zoo)
df %>% mutate(across(where(is.numeric), na.aggregate))

【讨论】:

    猜你喜欢
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2020-11-16
    • 2021-01-29
    • 1970-01-01
    • 2019-01-25
    相关资源
    最近更新 更多