我的数据包含 1000 列和 80 行,每五行对应一个组(第一列是类列)我想计算所有数字列的每个组的平均值,然后我想计算平均值之间的绝对值每个组的五行,并消除具有最高绝对值的行,然后使用剩下的四个样本重新计算该组的平均值,我的想法是我想消除重复(即远离其他四个重复,在 R
For example i have this data
class Values1 Values2
A1 A 5 10
A2 A 7 72
A3 A 4 8
A4 A 4 10
A5 A 30 10
B1 B 10 20
B2 B 12 18
B3 B 70 15
B4 B 15 100
B5 B 16 20
C1 C 120 5
C2 C 20 2
C3 C 25 72
C4 C 21 8
C5 C 22 3
MeanA Na 10 22
MeanB Na 24.6 34.6
MeanC NA 41.6 18
正如您在此示例中看到的,在 Values1 中,A 类应排除行 A5,B 类应排除行 B3,C 类应排除 C1 行,在 Values2 中,values2 应排除行 A2,B 类应排除行 B4 C3 行对应 C 类,然后新结果将是:
class class Values1 Values2
A1 A 5 10
A2 A 7 72
A3 A 4 8
A4 A 4 10
A5 A 30 10
B1 B 10 20
B2 B 12 18
B3 B 70 15
B4 B 15 100
B5 B 16 20
C1 C 120 5
C2 C 20 2
C3 C 25 72
C4 C 21 8
C5 C 22 3
MeanA Na 5 9.5
MeanB Na 13.25 18.25
MeanC NA 22 4.5
因此,对于 A 类,我排除 A5 来计算值 A 的平均值(A1、A2、A3、A4 的平均值),并且排除行 A2 以计算 Values2 的平均值,其他类的逻辑相同。
我的数据包含 80 行(16 个类)和超过 1000 列,我想取绝对值以排除与平均值差异最大的行
谢谢你
首先我会创建一个新函数:
robustmean <- function(x) mean(x[-which.max(abs(x-mean(x)))])
这取向量值的平均值
x
,但首先删除距整个向量的平均值最远的值。
然后将聚合与新函数一起使用。此语法删除第一列(行 ID),然后使用提供的函数在
class
上聚合所有其他列:
aggregate(data=mydata[,-1] , .~class, FUN=robustmean)
这给你:
class Values1 Values2
1 A 5.00 9.50
2 B 13.25 18.25
3 C 22.00 4.50
如果您确实愿意,可以将其
rbind
添加到原始数据。
您需要考虑如何处理丢失的数据(如果有)。
我还应该指出,
R
在mean
函数中已经有一个选项来制作“修剪平均值”,这将排除最高值和最低值。还有其他稳健的集中趋势估计器可以处理异常值(包括中位数),您应该研究一下从每个向量中排除单个最极端点的想法是否有效且有用。