使用na.omit或NA.RM和mapply跨Datafrme的多个列忽略R中的NA

问题描述

我有一个看起来像这样的数据框:

 SampleNo Lab1  Lab2  Lab3 lab4    lab5    lab6    lab7   lab8    lab9   lab10 
1  59.84    60.59   60.39   60.29   60.19   60.32   60.24   60.3    60.43   NA
2  59.78    60.19   60.16   60.23   60.32   60.46   60.53   60.2    60.40   59.6
3  59.86    60.17   60.22   60.28   60.18   60.42   60.21   60.0    60.44   NA 
4  59.85    60.42   60.28   60.31   60.19   60.41   60.54   60.2    60.48  59.7 
5  59.97    60.79   60.30   60.26   60.40   60.47   60.52   60.0    60.46   59.7
6  60.03    60.26   60.36   60.21   60.32   60.46   60.50   60.1    60.29   60.0

我想对数据帧中每一列的平方求和,而忽略NA值并分配给新向量。我可以使代码适用于1列,但是我想使用mapply函数或类似方法来同时获取所有列中的值并分配给新向量。

我在单列中有以下代码

myvector <- sum(na.omit(df[,2] - mean(df[,2))^2))适用于1列

我已经针对整个数据帧尝试了以下

myvector <- (mapply(na.omit(sum(df[,2:11] - mean(df[,2:11]))^2)))

我收到错误消息,说“ match.fun(FUN)中存在错误:c(“” na.omit(sum(df [,2:11]-mean(df [,不是函数,字符或符号”, 2:11])))^ 2不是功能字符或符号

myvector <- (mapply(sum(na.omit(df[,2:11]))^2)))

但出现此错误

sum(na.omit,df [,2:11]-mean(df [,: 参数的无效“类型”(关闭) 另外:警告消息: 在mean.default(df [,2:11])中: 参数不是数字或逻辑:返回NA

我的想法是na.omit放在错误的位置,但是我不知道应该去哪里。

解决方法

您可以转置数据,减去列均值,然后计算平方和。

Loss: 0.12500004789165717
Best values (a2,a1,a0): (-1.0001922562970325,2.5003368582261487,0.00014521557599919338)

此外,您可以将每列的 样本方差 与相应的非缺失值的长度减去1以获得平方差之和。

rowSums((t(df[-1]) - colMeans(df[-1],na.rm = TRUE))^2,na.rm = TRUE)

公式:

,

如果要按列执行操作,可以使用sapply进行此操作。

sapply(df[-1],function(x) sum((x - mean(x,na.rm = TRUE))

或者将colSumscolMeanssweep一起使用:

colSums(sweep(df[-1],2,colMeans(df[-1],na.rm = TRUE)) ^ 2,na.rm = TRUE)

# Lab1  Lab2  Lab3  lab4  lab5  lab6  lab7  lab8  lab9 lab10 
# 0.04  0.31  0.04  0.01  0.04  0.02  0.12  0.07  0.02  0.09 

请注意,您可以使用na.rm = TRUE来忽略NA的值。

数据

df <- structure(list(SampleNo = 1:6,Lab1 = c(59.84,59.78,59.86,59.85,59.97,60.03),Lab2 = c(60.59,60.19,60.17,60.42,60.79,60.26),Lab3 = c(60.39,60.16,60.22,60.28,60.3,60.36),lab4 = c(60.29,60.23,60.31,60.26,60.21),lab5 = c(60.19,60.32,60.18,60.4,60.32),lab6 = c(60.32,60.46,60.41,60.47,60.46),lab7 = c(60.24,60.53,60.21,60.54,60.52,60.5),lab8 = c(60.3,60.2,60,60.1),lab9 = c(60.43,60.44,60.48,60.29),lab10 = c(NA,59.6,NA,59.7,60)),class = "data.frame",row.names = c(NA,-6L))