我有一个由三列组成的数据框(参见代码中的示例)。第一列包含类别 (a),第二列包含观察次数 (b),第三列包含这些观察的平均值 (c)。
#create a test df
a<-factor(c("aaa","aaa","aaa","ddd","eee","ddd","aaa","ddd"))
b<-c(3,4,1,3,5,7,3,2)
c<-c(1,2,NA,4,5,6,7,NA)
df.abc<-data.frame(a=a,b=b,c=c)
df.abc
如果观察数为 1 或 2,则将条目标记为缺失值 (NA)。
所以我的函数的目的是用每个类别的平均值替换这些缺失值。
我带了我一段时间,但我得到了一个函数,它将所有缺失值替换为一个类别(如果观察结果为 1)。它看起来像这样:
#function to substitue the missing values in row c by their means
#according to their categories
function.abc<-function(x){
ifelse(
(df.abc[,1]==x)&(df.abc[,2]==1),
mean(df.abc$c[df.abc$a ==x],na.rm=TRUE),
df.abc[,3]
)
}
测试这个功能:
#test the function for the category "ccc"
function.abc("aaa")
它工作得很好(但只是平均值而不是平均平均值)输出是:
[1] 1.000000 2.000000 3.333333 4.000000 5.000000 6.000000 7.000000 不适用
现在我的问题是,我有很多类别(n = 32),我试图将此函数应用于包含我的类别的向量。在这种情况下,一个简单的例子是:
#test the function for a testvector
test.vector<-c("aaa","ddd")
function.abc(test.vector)
输出是:
[1] 1.0 2.0 4.5 4.0 5.0 6.0 7.0 不适用
所以显然这不会奏效......
有人可以帮我重新安排功能吗?我对编程很陌生,设计短而好的功能对我来说仍然是一个很大的挑战......
编辑:
我希望输出为: [1] 1.000000 2.000000 3.20000 4.000000 5.000000 6.000000 7.000000 5.000000
所以 aaa 组 (3.20000) 的平均值替换 aaa 中的 NA 值,ddd 组 (5.0000000) 的平均值替换 ddd 中的 NA ...