首页 > 解决方案 > 为什么我在使用替换功能时收到此消息?在 mean.default(x, na.rm = TRUE) 中:参数不是数字或逻辑:返回 NA

问题描述

我正在使用R 中的替换函数,并制作了这个简单的函数来修改向量均值的值。它在单个向量上完美运行:

'value.for.mean<-' <- function(x, value, ...) {
    x[value] = mean(x, na.rm=TRUE)
    x
}

x <- c(1:3,NA, 2:5,1:10, NA, NA)
value.for.mean(x) <- is.na(x)
x   

#Output:    
[1]  1.00  2.00  3.00  4.41  2.00  3.00  4.00  5.00  1.00  2.00  3.00  4.00
[13]  5.00  6.00  7.00  8.00  9.00 10.00  4.41  4.41

当我尝试对 data.frame 使用相同的函数时,出现错误:

x <- data.frame(a=c(1,3,NA,4,2), b=c(9,8,5,4,NA))
value.for.mean(x) <- is.na(x)
Warning message:
In mean.default(x, na.rm = TRUE) :
  argument is not numeric or logical: returning NA

我在 SO 中阅读了许多涉及该错误的线程,但没有人指出这种特定情况,因为我的变量是数字的,正如您在调用时看到的那样str(x)

'data.frame':   5 obs. of  2 variables:
 $ a: num  1 3 NA 4 2
 $ b: num  9 8 5 4 NA

提前感谢您的评论。

标签: rfunctionfunctional-programming

解决方案


上的mean作品vector。根据?mean,用法是

mean(x, ...)

在哪里

x - 一个 R 对象。目前有数字/逻辑向量和日期、日期时间和时间间隔对象的方法。

因此,当我们mean在整体上应用时data.frame,它会给出与 OP 帖子中相同的警告信息,因为 OP 的函数是一个包装器mean

mean(x)
#[1] NA

警告消息:在 mean.default(x) 中:参数不是数字或逻辑:返回 NA


我们需要遍历列并应用函数,返回列并将 s 更新listvector原始数据集

x[] <- lapply(x, function(y) {
              value.for.mean(y) <- is.na(y)
               y})

或应用它tidyverse

library(tidyverse)
x %>% 
    mutate_all(funs({value.for.mean(.) <- is.na(.); .}))

这里


推荐阅读