对多个数据子集使用replace_na

By simon at 2018-02-07 • 0人收藏 • 54人看过

我试图用多个列变量随机替换NA 从每个student_id的子集行数据生成值:[数据 快照(https://i.stack.imgur.com/Q3Teo.png) 所以对于学生3来说,收缩需要两个替代的NAs。我用了最小和最大学生3子集内每个变量的值生成随机数 值。

library(dplyr)
library(tidyr)
library(tibble)
library(tidyverse)
dplyr::filter(exercise, student_id == "3") %>% replace_na(list(systolic= round(sample(runif(1000, 125,130),2),0), 
diastolic =round(sample(runif(1000, 85,85),3),0), heart_rate= round(sample(runif(1000, 79,86),2),0), 
phys_score = round(sample(runif(1000, 8,9),2),0)
然而,它只适用于一个NA需要替换:[已成功替换 收缩期NA值](https://i.stack.imgur.com/JXNE3.png)。当我尝试 更换更多比一个新手,这个错误出现了。
Error: Replacement for `systolic` is length 2, not length 1
有没有办法来解决这个问题?我试图将列变量转换为数据 弗拉姆而不是他们现在的载体,但它只是返回原来的 数据没有任何替换的变化。 有没有si多普勒方式呢?任何建议/意见将是 赞赏。谢谢。

1 个回复 | 最后更新于 2018-02-07
2018-02-07   #1

一个解决方案使事情变得更加自动化,但可能是不必要的 复杂。 从中生成一些分组丢失的数据mtcars数据集

library(magrittr)
library(purrr)
library(dplyr)
library(stringr)
library(tidyr)

## Generate some missing data with a subset of car make
mtcars_miss <- mtcars %>%
  as_tibble(rownames = "car") %>%
  select(car) %>% 
  separate(car, c("make", "name"), " ") %>% 
  bind_cols(mtcars[, -1] %>%   
              map_df(~.[sample(c(TRUE, NA), prob = c(0.8, 0.2), 
                               size = length(.), replace = TRUE)])) %>% 
  filter(make %in% c("Mazda", "Hornet", "Merc"))
通过在最小范围内采样来替换给定变量的na值的函数 和最大和依赖在一些组(在这里)。
replace_na_sample <- function(df_miss, var, group = "make") {

  var <- enquo(var)

  df_miss %>% 
    group_by(.dots = group) %>% 
    mutate(replace_var := round(runif(n(), min(!!var, na.rm = T),
                                      max(!!var, na.rm = T)), 0)) %>% 
    rowwise %>% 
    mutate_at(.vars = vars(!!var),
              .funs = funs(replace_na(., replace_var))) %>% 
    select(-replace_var) %>% 
    ungroup

}
用多个列替换多个缺失值的示例。
mtcars_replaced <- mtcars_miss  %>% 
  replace_na_sample(cyl, group = "make") %>% 
  replace_na_sample(disp, group = "make") %>%
  replace_na_sample(hp, group = "make")

登录后方可回帖

Loading...