【问题标题】:Using replace_na for multiple data subsets对多个数据子集使用 replace_na
【发布时间】:2018-07-16 06:44:51
【问题描述】:

我正在尝试用从每个 student_id 的子集行数据中随机生成的值替换多个列变量中的 NA: data snapshot

所以对于学生 3,收缩压需要更换两个 NA。我使用学生 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 需要替换时才有效:successfully replaced systolic NA values。当我尝试替换多个 NA 时,会出现此错误。

Error: Replacement for `systolic` is length 2, not length 1

有没有办法解决这个问题?我尝试将列变量转换为数据框而不是它们现在的向量,但它只返回原始数据而没有任何替换更改。

有没有更简单的方法呢?任何建议/cmets 将不胜感激。谢谢。

【问题讨论】:

  • 请展示一个使用dput而不是图片的可重现的小例子。我认为您需要在mutate 中创建systolicdiastolicheart_rate 等,然后执行replace_naexercise %>% filter(student_id =="3") %>% mutate(systolic = round(sample(runif(1000, 125, 130), 2), 0), ..

标签: r replace subset


【解决方案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"))

通过在最小值和最大值内采样并根据某个组(此处为 make)来替换给定变量中的 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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-11
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    相关资源
    最近更新 更多