我在玩 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
预先感谢您的评论。
答案 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
这里