Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 用分组方式替换NAs_R_Replace_Mean_Na - Fatal编程技术网

R 用分组方式替换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

我有一个包含7000个观测值和196个变量的数据框,整个数据框中散布着NAs。我创建了一个函数来捕获数据帧中每个数值变量的分组平均值(187个数值变量,11个组)。如果观察是一个组的一部分,我现在尝试用适当的变量分组平均值替换NAs

基本上,我希望在框架中找到NAs,并替换为适当的组平均值变量

如果
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 factor
V4
的级别。因此,选择一个具有级别的因子(例如,
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]])]
    }
}