r - 在 R 中手动计算方差
问题描述
我在这里需要你的帮助。我需要在 R 中手动计算方差。我已经用这个代码实现了它,它对于缺失值和非数字数据类型不够健壮。
a= c(1,2,3,4,5)
k=mean(a,na.rm = T)
storage=a
for(i in 1:length(a)) {
storage[i]= ((i-k)^2)
}
storage =sum((storage)/(length(a)-1))
storage
当我有 a= c(1,2,3,4,5,c,NA) 时我遇到了麻烦请问我将如何编辑代码?
解决方案
首先,有几点观察:
- 在 R 中,您可以对整个向量进行操作。例如
(c(1, 2, 3))^2
产量1 4 9
。没有必要使用for
循环。 mean
不是唯一需要的功能na.rm = TRUE
;sum
也是。- 在 R 中,原子向量(几乎是所有不是列表的向量)只能具有一种数据类型的元素。有四种主要类型:逻辑、整数、双精度和字符。如果向量中有多个类型,则所有元素都被强制为相同,顺序如下:字符→双精度→整数→逻辑。例如,
c(1, 'c')
将返回字符向量"1", "c"
。这就是你遇到麻烦的原因。(注意:如果NA
向量中有一个,它的类型将与向量的类型相同。)
不幸的是,对于那个特定的向量,c(1,2,3,4,5,c,NA)
我认为没有一种简单的方法可以将其强制为整数。那是因为它是一个将函数作为元素的列表:函数c()
。
但是,只要x
是原子向量,此函数就可以工作:
variance <- function(x){
x = as.numeric(x)
x = na.omit(x)
m = mean(x)
return(
sum((x-m)^2, na.rm = TRUE)/(length(x) - 1)
)
}
首先我们将向量强制转换为数字,这样我们就可以处理像c(1, 2, 'a')
. 然后我们去掉NA
's,这样我们就不用写andna.rm = TRUE
了。然后我们只写公式。mean
sum
一个小的不便之处在于,当将字符向量转换为数字时,我们会收到一条警告说NA
s 已生成。如果我们改写,这可以解决x = suppressWarnings(as.numeric(x))
。
如果您希望您的函数能够处理带有函数的列表,请告诉我。
推荐阅读
- html - 安装了 Nunjucks 扩展来格式化 HTML
- java - 为什么调用顺序会影响执行时间?
- java - 如何使 cxf jax-rs response.readEntity 成为通用的
- xamarin - 将数据从服务器插入 SQLite 数据库
- android - 新文件 Drawable 不可用我参考
- mysql - 当一个为空时按顺序组合两个结果列
- laravel - Laravel 5.7 按日期搜索
- material-ui - 如何覆盖选项卡的选定样式?
- java - 使用 mongoTemplate 在 Spring 中创建 mongo 查询
- postgresql - org.postgresql.util.PSQLException:错误:在 WHERE 中不允许设置返回函数