首页 > 解决方案 > map_dbl 中的函数没有给出预期的结果,但如果手动运行则可以

问题描述

我真的很困惑为什么我的一个功能表现得如此奇怪。这是一些数据和函数本身:

match0 <- function(i, df) {
      df <- as.data.frame(df)
      j <- 1:nrow(df)
    
      if (!is.na(df$p201[i])) {
        l <- i
      } else {
        k <- 
          (!(df$Ano[i] == df$Ano[j] & df$Trimestre[i] == df$Trimestre[j] & i != j)) &
          df$V2008[i] != 99 &
          df$V20081[i] != 99 &
          df$V20082[i] != 9999
    
        l <- ifelse(any(k), which(k), i)
      }
    
      return(l)
    }

dataset <- structure(list(UF = structure(c(11, 11), format.stata = "%8.0g"), 
    UPA = structure(c(110000227, 110000227), format.stata = "%12.0g"), 
    V1008 = structure(c(1, 1), format.stata = "%8.0g"), V1014 = structure(c(1, 
    1), format.stata = "%8.0g"), V2007 = structure(c(1, 1), format.stata = "%8.0g"), 
    V2008 = structure(c(17, 17), format.stata = "%8.0g"), V20081 = structure(c(1, 
    1), format.stata = "%8.0g"), V20082 = structure(c(1969, 1969
    ), format.stata = "%8.0g"), Ano = structure(c(2012, 2012), format.stata = "%8.0g"), 
    Trimestre = structure(c("1", "2"), format.stata = "%9s"), 
    V2003 = structure(c(1, 1), format.stata = "%8.0g")), row.names = c(NA, 
-2L), class = c("tbl_df", "tbl", "data.frame"))

这是我想做的事情:

dataset %>%
  group_by(UF, UPA, V1008, V1014, V2007, V2008, V20081, V20082) %>%
  arrange(UF, UPA, V1008, V1014, V2007, V2008, V20081, V20082, Ano, Trimestre, V2003) %>%
  group_by(index = map_dbl(
    seq(n()),
    ~ match0(.x, df = cur_data())
  ), .add = TRUE)

该函数应该清楚地index = 1为两行产生。但是,它不会运行上面的代码。但是,如果我不使用map_dbl并逐行手动检查,我会得到想要的结果。

有人可以帮我找出原因吗?

标签: rfunctiondplyrpurrr

解决方案


?cur_data

cur_data() 给出当前组的当前数据(不包括分组变量)

因此,它传递数据而不对您在函数中检查的变量进行分组。当前的解决方法是cur_group()通过cur_data().

library(dplyr)

dataset %>%
  group_by(UF, UPA, V1008, V1014, V2007, V2008, V20081, V20082) %>%
  arrange(UF, UPA, V1008, V1014, V2007, V2008, V20081, V20082,
           Ano, Trimestre, V2003) %>%
   group_by(index = purrr::map_dbl(seq(n()),
                     ~ match0(.x, df = cbind(cur_group(), cur_data()))
   ), .add = TRUE)


#     UF       UPA V1008 V1014 V2007 V2008 V20081 V20082 V2003   Ano Trimestre  p201   n_p index
#  <dbl>     <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl> <chr>     <dbl> <dbl> <dbl>
#1    11 110000227     1     1     1    17      1   1969     1  2012 1             1     1     1
#2    11 110000227     1     1     1    17      1   1969     1  2012 2            NA     2     1

将来,会有cur_data_all()哪些将通过分组变量传递当前数据。


推荐阅读