R 用分组方式替换NAs
我有一个包含7000个观测值和196个变量的数据框,整个数据框中散布着NAs。我创建了一个函数来捕获数据帧中每个数值变量的分组平均值(187个数值变量,11个组)。如果观察是一个组的一部分,我现在尝试用适当的变量分组平均值替换NAs 基本上,我希望在框架中找到NAs,并替换为适当的组平均值变量 如果R 用分组方式替换NAs,r,replace,mean,na,R,Replace,Mean,Na,我有一个包含7000个观测值和196个变量的数据框,整个数据框中散布着NAs。我创建了一个函数来捕获数据帧中每个数值变量的分组平均值(187个数值变量,11个组)。如果观察是一个组的一部分,我现在尝试用适当的变量分组平均值替换NAs 基本上,我希望在框架中找到NAs,并替换为适当的组平均值变量 如果df[6501174]为组7&NA,则替换为组7变量174的平均值 这是我使用的最小的数据帧,我关心的是效率 历史时间序列数据如下所示: str(HD_filtered) Classes ‘tbl_d
df[6501174]
为组7&NA,则替换为组7变量174的平均值
这是我使用的最小的数据帧,我关心的是效率
历史时间序列数据如下所示:
str(HD_filtered)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 7032 obs. of 196 variables:
$ Date: Factor w/ 87 levels "12/31/1993","03/31/1994",..: 1 2 2 2 2 2 2 2 2 2 ...
$ V2: Factor w/ 1065 levels "","000361105",..: 246 183 312 31 80 87 132 124 121 211 ...
$ V3: Factor w/ 744 levels "A S V","A V",..: 326 231 22 41 106 113 170 160 157 272 ...
$ V4: Factor w/ 7 levels "BHS","BMU","CAN",..: 7 7 7 7 7 7 7 7 7 7 ...
$ V5: Factor w/ 68 levels "I2",..: 48 16 17 28 11 10 38 28 11 13 ...
$ V6: Factor w/ 1 level "C": 1 1 1 1 1 1 1 1 1 1 ...
$ V7: Factor w/ 11 levels "S1",..: 7 4 9 1 6 8 8 1 6 6 ...
$ V8: Factor w/ 146 levels "SI1",..: 8 77 57 51 16 91 93 49 31 22 ...
$ V9: Factor w/ 1259 levels "","3HCKT","3RVTL",..: 261 23 294 26 82 95 111 1
$ V10: num 0.429 7.4 5 7.75 12 ...
$ V11: num 0.839 2.117 0.97 1.237 1.934 ...
$ V12: num NA -0.176 0.262 0.012 0.146 ...
$ V12: num NA NA NA NA NA NA NA NA NA NA ...
$ V13: num NA NA NA NA NA NA NA NA NA NA ...
$ V196: num NA .045 .62 .034 NA NA NA .012 .03 NA
我创建了一个函数,使用dplyr根据组(日期、V4、V5、V7、V8)计算V10:V196的平均值
Summary_Stats_Function <- function(hd, cmn) {
hd %>%
group_by_(.dots = cmn) %>%
summarise_each(funs(min, max, median, mean(., trim = 0.01, na.rm = TRUE), sd(., na.rm = TRUE)), V10:V196)
}
Universal_Summary_Stats_byV4 <- Summary_Stats_Function(HD_filtered, "V4")
Summary\u Stats\u函数%
分组依据(.dots=cmn)%>%
总结每个(funs(最小值、最大值、中位数、平均值(、trim=0.01,na.rm=TRUE)、sd(、na.rm=TRUE))、V10:V196)
}
Universal\u Summary\u Stats\u byV4可能不是一个优雅的解决方案,但下面是一个基本的R解决方案,它使用分组平均数的数据帧和嵌套的for
循环中的原始数据帧的merge()
首先,因为您只需要means,所以使用only means运行您的summary_each()
,以获得V10_-V196_-means
的输出
Summary_Stats_Function <- function(hd, cmn) {
hd %>%
group_by_(.dots = cmn) %>%
summarise_each(funs(mean(., trim = 0.01, na.rm = TRUE)), V10:V196)
}
Summary\u Stats\u函数%
分组依据(.dots=cmn)%>%
总结每个(funs(平均值(,trim=0.01,na.rm=TRUE)),V10:V196)
}
然后运行嵌套for循环,在组级别调用上述函数,并在外部循环中合并数据帧:
# ITERATE THROUGH EACH GROUP (ASSUMING MUTUALLY EXCLUSIVE)
for (grp in c("V4", "V5", "V7", "V8")) {
replace_with <- Summary_Stats_Function(HD_filtered, grp)
mergedf <- merge(HD_filtered, replace_with, by=grp)
# ITERATE THROUGH EACH NUMERIC COLUMN
for (i in 10:196) {
mergedf[[i]][is.na(mergedf[[i]])] <-
mergedf[[paste0("V", i,"_mean")]][is.na(mergedf[[i]])]
}
}
#遍历每个组(假设相互排斥)
对于(c(“V4”、“V5”、“V7”、“V8”)中的grp){
用see替换_获得一些启示此外:欢迎来到StackOverflow&请阅读有关如何生成a的信息。这将使其他人更容易帮助您。?zoo::na.aggregate
可能会有所帮助,但如果没有样本数据,这纯粹是推测。请提供一个可复制的示例。这将非常简单ave
函数,但从统计角度来看,它的意义不太明确。你能解释一下htis的目标,以便提供更好的策略吗?谢谢。zoo软件包看起来是一个很有前途的新方向。谢谢,Parfait。我不能很好地实现这一点,但我认为你使用不雅观的迭代嵌套for循环是正确的最终的结果。也就是说,我认为我一开始就成功地把事情弄得太复杂了(例如,Summary\u stats\u Function
中的各种统计数据和一个复杂的问题),所以我要重新排序流,看看这是否有帮助。如果可能的话,我会更新这个。但是很好奇,你收到了什么错误?你的意思是中的列替换为不存在吗?合并by
变量失败了吗?错误的数据类型(因子vs数字)?嗯,有两件事。一,运行总结每个()
仅使用means是正确的想法,但是我不需要在中使用select()
替换为。第二,错误显示为:fix中的错误。by(by.y,y):“by”必须指定唯一有效的列
。事实上,这两个选项都可能与只对进行过滤有关。u means
删除了组变量(V4、V5、V7、V8)这是后来在合并中使用的。我删除了select()
。通过错误修复了。您的解决方案建议迭代grp
,但我复杂的问题应该要求一个解决方案来迭代say factorV4
的级别。因此,选择一个具有级别的因子(例如,V4
为11个水平,如果观察结果属于该水平/组,则用该因子水平的平均值替换NAs。
# ITERATE THROUGH EACH GROUP (ASSUMING MUTUALLY EXCLUSIVE)
for (grp in c("V4", "V5", "V7", "V8")) {
replace_with <- Summary_Stats_Function(HD_filtered, grp)
mergedf <- merge(HD_filtered, replace_with, by=grp)
# ITERATE THROUGH EACH NUMERIC COLUMN
for (i in 10:196) {
mergedf[[i]][is.na(mergedf[[i]])] <-
mergedf[[paste0("V", i,"_mean")]][is.na(mergedf[[i]])]
}
}