问题描述
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))
或者将colSums
和colMeans
与sweep
一起使用:
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))