嗨,我试图使用相应组中的可用值来计算缺少的值。有关示例,请参阅下列数据。
dput(question)
structure(list(Group = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L
), .Label = c("A", "B"), class = "factor"), Year = c(2004L, 2005L,
2006L, 2007L, 2006L, 2007L, 2008L), Score = c(NA, 100L, NA, 95L,
NA, NA, 88L)), .Names = c("Group", "Year", "Score"), class = "data.frame", row.names = c(NA,
-7L))对于2004年A组的第一个NA得分,我想使用同一组中最接近的年份(即2005年A组的100分);对于A组2006年的NA,我想使用A组2005年和2007年的平均得分;对于B组的NS,我想使用2008年的B组。
是否有适用于我的案例的r包归责?或者你对这种归罪有什么建议?
真的很感激
更新后,我修正了精神病学家的宏,以便使用年份来计算距离。抱歉,我不知道怎么把修正后的密码放在“精神神经学”之后。
impute_nearest = function(dat, var0, var){
for(i in 1:length(dat[,var])){
if(is.na(dat[,var][i])){
na.pos <<- dat[, var0][i]
non.na.pos <<- dat[, var0][which(!is.na(dat[,var]))]
distance <<- min(abs(na.pos-non.na.pos))
dat[,var][i] = mean(c(dat[which(dat[, var0]==(na.pos+distance)),var], dat[which(dat[, var0]==(na.pos-distance)),var]),
na.rm=T)
}
}
return(dat)
}发布于 2014-10-07 22:07:53
我非常怀疑,用一个单一的价值或只有两个的平均值来归咎于你的失败是一个好主意。假设您在2010年有一个巨大的异常值,而之前的5个值都是NAs。
然而,这里有一个解决您的问题的有效解决方案。我知道这可能不是最优雅的方式,但它有效,我让其他人建议更好的方法去做。
根据组划分您的数据:
datA=dat[dat$Group=="A",]
datB=dat[dat$Group=="B",]下面是一个简短的函数,它取与缺失值距离相同的壁橱不丢失值的平均值。
impute_nearest = function(dat, var){
for(i in 1:length(dat[,var])){
if(is.na(dat[,var][i])){
na.pos = which(is.na(dat[,var]))
non.na.pos = which(!is.na(dat[,var]))
distance = abs(na.pos-non.na.pos)
dat[,var][i] = mean(c(dat[,var][i+distance], dat[,var][i-distance]),
na.rm=T)
}
}
return(dat)
}如下所示,使用、dat、和var,后者是您希望输入到该df中的变量的名称。将变量作为字符(例如:“得分”)。下面是数据子集之一的示例:
impute_nearest(datB, "Score")https://stackoverflow.com/questions/26245155
复制相似问题