在purrr::map内使用if语句以避免丢失数据错误 [英] Using an if-statement inside purrr::map to avoid missing data errors

查看:17
本文介绍了在purrr::map内使用if语句以避免丢失数据错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用PURRR对分组数据集的多列运行一系列单线性回归,但是在不删除整个组的情况下排除没有数据的变量组时遇到问题。

多亏了Andrew_Reesshere,我让基本代码按如下方式工作:

library(tidyverse)

ivs <- colnames(mtcars)[3:ncol(mtcars)]
names(ivs) <- ivs

mtcars %>% 
  group_by(cyl) %>% 
  group_modify(function(data, key) {
    map_df(ivs, function(iv) {
      frml <- as.formula(paste("mpg", "~", iv))
      lm(frml, data = data) %>% broom::glance()
      }, .id = "iv") 
  }) %>% 
  select(cyl, iv, r.squared, p.value)

它提供此格式的Tibble:

cyl iv      r.squared       p.value
4   disp    0.6484051396    0.002782827 
4   hp      0.2740558319    0.098398581 
4   drat    0.180           0.193  
4   wt      0.509           0.0137 
4   qsec    0.0557          0.485  
4   vs      0.00238         0.887  
...
6   disp    0.0106260401    0.825929685 
...
不幸的是,我的实际数据集杂乱无章,包含多个组变量组合,只有nas,或者少于两个实际值,这是lm无法处理的。为了说明这一点,这里是mtcar,其中"disp"中的一些数据被NA替换。运行以上代码时,MTNA会抛出NA-Error。

#create mtcars dataset that will have a cyl group with entirely NA disp
mtna <- mtcars 
mtna$disp[mtna$disp < 147] <- NA

test <- mtna %>% group_by(cyl) %>% summarize(mean = mean(disp))

我试图通过使lm具有条件来处理此问题,并首先使用sum(!is.na)检查是否有足够的实值来运行lm。这允许lm成功运行。

mtna %>% 
  group_by(cyl) %>% 
  group_modify(function(data, key) {
    map_df(ivs, function(iv) {
      tmpvar <- eval(parse(text = paste0("data$", iv)))
      if(sum(!is.na(tmpvar)) < 3) {return(NA)} else {
      frml <- as.formula(paste("mpg", "~", iv))
      lm(frml, data = data) %>% broom::glance()
      }}, .id = "iv") 
  }) %>% 
  select(cyl, iv, r.squared, p.value)

#which gives:
       cyl    iv        r.squared  p.value
 1     4      NA        NA         NA     
 2     6      disp      0.0115     0.840 
 3     6      hp        0.0161     0.786 
 4     6      drat      0.0132     0.807 
...
但是,当您查看结果时,您可以看到NA已经扩展到整个组,包括除disp以外的变量(这是唯一缺少值的变量)。现在根本没有与cyl = 4相关的数据,即使在像hp和drat这样没有丢失数据的组中也是如此。

我希望是这样的:

cyl    iv        r.squared      p.value
4      disp      NA             NA 
4      hp        0.2740558319   0.098398581   # Currently missing
4      drat      0.1799791311   0.193450651   # Currently missing     
4      wt        0.5086325963   0.013742782.  # Currently missing
... 
6      disp      0.0106260401   0.825929685 
6      hp        0.0161462379   0.78602021  
...

我怀疑这与数据格式有关-我猜我要将NA映射到该组的所有结果中,而不只是这一个变量。但我不知道如何解决这个问题。如有任何帮助,我们将不胜感激!

推荐答案

我想您就快成功了。请看一下下面的代码。更改已批注。

library(tidyverse)

ivs <- colnames(mtcars)[3:ncol(mtcars)]
names(ivs) <- ivs

mtna <- mtcars 
mtna$disp[mtna$disp < 147] <- NA

mtna  %>% 
  group_by(cyl) %>% 
  group_modify(function(data, key) {
    map_df(ivs, function(iv) {
      tmpvar<-eval(parse(text = paste0("data$", iv)))
      if(!is.na(sum(tmpvar))) {                          #only use complete data
        frml <- as.formula(paste("mpg", "~", iv))
        lm(frml, data = data) %>% broom::glance()
      }}, .id = "iv") 
  }) %>% 
  select(cyl, iv, r.squared, p.value) %>% 
  right_join(.,expand.grid(cyl=unique(mtna$cyl),iv=ivs),
             by=c("cyl","iv")) %>%                       #populating with NA for columns lost before
  arrange(., cyl, iv) %>%                                #sort by cyl and iv
  as.data.frame()
  

  #which gives:
       cyl   iv    r.squared    p.value
    1    4   am 0.2872892493 0.08921640
    2    4 carb 0.0378466325 0.56650426
    3    4 disp           NA         NA
    4    4 drat 0.1799791311 0.19345065
    5    4 gear 0.1146552225 0.30840242
    6    4   hp 0.2740558319 0.09839858
    7    4 qsec 0.0556742395 0.48487154
    8    4   vs 0.0023819528 0.88668635
    9    4   wt 0.5086325963 0.01374278
    10   6   am 0.2810551424 0.22094408
    11   6 carb 0.0000661434 0.98619369
    12   6 disp           NA         NA
    13   6 drat 0.0131597553 0.80653099
    14   6 gear 0.0000901510 0.98388187
    15   6   hp 0.0161462379 0.78602021
    16   6 qsec 0.1753245893 0.34980138
    17   6   vs 0.2810551424 0.22094408
    18   6   wt 0.4645101506 0.09175766
    19   8   am 0.0024647887 0.86615546
    20   8 carb 0.1550637156 0.16359436
    21   8 disp 0.2701577717 0.05677488
    22   8 drat 0.0022975223 0.87074078
    23   8 gear 0.0024647887 0.86615546
    24   8   hp 0.0804491933 0.32575378
    25   8 qsec 0.0108860059 0.72261712
    26   8   vs 0.0000000000         NA
    27   8   wt 0.4229655365 0.01179281

这篇关于在purrr::map内使用if语句以避免丢失数据错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆