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

时间:2018-12-31 08:24:04

标签: r function functional-programming

我在玩 replacement functions in 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

预先感谢您的评论。

1 个答案:

答案 0 :(得分:2)

mean适用于vector。根据{{​​1}},用法是

?mean

其中

  

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

因此,当我们在整个mean(x, ...) 上应用mean时,它会给出与OP帖子中相同的警告消息,因为OP的功能是data.frame的包装器

mean
  

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


我们需要遍历各列并应用函数,返回该列,并将mean(x) #[1] NA 中的list更新回原始数据集

vector

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

一起应用
tidyverse

这里