我有一个如下所示的数据框:
set.seed(300)
df <- data.frame(site = sort(rep(paste0("site", 1:5), 5)),
value = sample(c(1:5, NA), replace = T, 25))
df
site value
1 site1 NA
2 site1 5
3 site1 5
4 site1 5
5 site1 5
6 site2 1
7 site2 5
8 site2 3
9 site2 3
10 site2 NA
11 site3 NA
12 site3 2
13 site3 5
14 site3 4
15 site3 4
16 site4 NA
17 site4 NA
18 site4 4
19 site4 4
20 site4 4
21 site5 NA
22 site5 3
23 site5 3
24 site5 1
25 site5 1
如您所见,value
列中有几个缺失值。我需要将value
列中的缺失值替换为站点的均值。因此,如果在value
处测量的site1
缺少值,我需要为value
计算均值site1
。但是,数据帧不断被添加到R中并导入到R中,下次导入数据帧时,它可能会增加到50行的长度,value
中可能会有更多的缺失值。 。我需要创建一个函数,它将自动检测哪个站点中value
的缺失值被测量,并为该特定站点计算缺失值。有人可以帮帮我吗?
答案 0 :(得分:10)
使用impute()
包中的Hmisc
和ddply
包中的plyr
:
require(plyr)
require(Hmisc)
df2 <- ddply(df, "site", mutate, imputed.value = impute(value, mean))
答案 1 :(得分:2)
首先,您可以获得不同级别的网站。
sites=levels(df$site)
然后,您可以获得不同级别的方法
nlevels=length(sites)
meanlist=numeric(nlevels)
for (i in 1:nlevels)
meanlist[i]=mean(df[df[,1]==sites[i],2],na.rm=TRUE)
然后您可以填写每个NA值。可能有一种更快的方法,但只要您的设置不是很大,就可以使用for循环。
for (i in 1:dim(df)[1])
if (is.na(df[i,2]))
df[i,2]=meanlist[which(sites==df[i,1])]
希望这有帮助。
答案 2 :(得分:2)
一个(一个很长的)行中没有for
循环的解决方案。
set.seed(300)
df <- data.frame(site = sort(rep(paste0("site", 1:5), 5)),
value = sample(c(1:5, NA), replace = T, 25))
df$value[is.na(df$value)] <- ave(df$value, df$site,
FUN = function(x)
mean(x, na.rm = TRUE))[c(which(is.na(df$value)))]
作为一个功能:
fillITin <- function(x){
x$value[is.na(x$value)] <- ave(x$value, x$site,
FUN = function(z)
mean(z, na.rm = TRUE))[c(which(is.na(x$value)))]
return(x)
}
fillITin(df)