【问题标题】:can not use list in pmap function in r不能在 r 中的 pmap 函数中使用列表
【发布时间】:2020-09-04 07:42:09
【问题描述】:

我有 2 个向量(resposepca)和 1 个列表(test),我想将它们与 expand.grid 一起使用:

final = rbind(
  expand.grid(response = response,pre1=test[[1]],pre2=pca[1],stringsAsFactors = FALSE),
  expand.grid(response = response,pre1=test[[2]],pre2=pca[2],stringsAsFactors = FALSE),
  expand.grid(response = response,pre1=test[[3]],pre2=pca[3],stringsAsFactors = FALSE),
  expand.grid(response = response,pre1=test[[4]],pre2=pca[4],stringsAsFactors = FALSE),
  expand.grid(response = response,pre1=test[[5]],pre2=pca[5],stringsAsFactors = FALSE),
  expand.grid(response = response,pre1=test[[6]],pre2=pca[6],stringsAsFactors = FALSE),
  expand.grid(response = response,pre1=test[[7]],pre2=pca[7],stringsAsFactors = FALSE)
)

重复代码太多,我重写代码使用map_dfr:

final2 <- map_dfr(1:7, 
                  ~ expand.grid(response = response,pre1=test[[.]],pre2=pca[.],stringsAsFactors = FALSE))

那我也想用pmap_dfr做这个但是报错:

agrg.list = list(response = response, pre1 = test, pre2 = pca)

final3 <- pmap_dfr(agrg.list, 
                   ~expand.grid(response = response, pre1 = unlist(pre1), pre2= pre2, stringsAsFactors = F))

错误:.l 的元素 1 的长度必须为 1 或 7,而不是 5

我想知道代码是否只能由map_dfr 而不是pamp_dfr 重写。

任何帮助将不胜感激!

这是我的 2 个向量和 1 个列表:

test <- list(c("PM2_5_s_lag_1", "PM2_5_m_lag_1", "PM2_5_s_lag_2", "PM2_5_m_lag_2", 
               "PM2_5_s_lag_3", "PM2_5_m_lag_3"), c("pca_PMC", "PMC_s_lag_1", 
                                                    "PMC_m_lag_1", "PMC_s_lag_2", "PMC_m_lag_2", "PMC_s_lag_3", "PMC_m_lag_3"
               ), c("pca_PM10", "PM10_s_lag_1", "PM10_m_lag_1", "PM10_s_lag_2", 
                    "PM10_m_lag_2", "PM10_s_lag_3", "PM10_m_lag_3"), c("NO2_s_lag_1", 
                                                                       "NO2_m_lag_1", "NO2_s_lag_2", "NO2_m_lag_2", "NO2_s_lag_3", "NO2_m_lag_3"
                    ), c("SO2_s_lag_1", "SO2_m_lag_1", "SO2_s_lag_2", "SO2_m_lag_2", 
                         "SO2_s_lag_3", "SO2_m_lag_3"), c("CO_s_lag_1", "CO_m_lag_1", 
                                                          "CO_s_lag_2", "CO_m_lag_2", "CO_s_lag_3", "CO_m_lag_3"), c("O3_s_lag_1", 
                                                                                                                     "O3_m_lag_1", "O3_s_lag_2", "O3_m_lag_2", "O3_s_lag_3", "O3_m_lag_3"
                                                          ))


pca <- c("pca_pm2_5", "pca_PMC", "pca_PM10", "pca_NO2", "pca_SO2", "pca_CO", 
         "pca_O3")

response <- c("X0.whole", "X0.man", "X0.woman", "X0.agelo65", "X0.ageupwith65"
)

【问题讨论】:

  • pcaresponse 应该有相同的长度,response[7] 不存在

标签: r tidyverse purrr


【解决方案1】:

response 变量是常量并且不会改变,因此您不应该在任何map 函数中传递它。因为只有 2 个变量会改变使用 map2_df

purrr::map2_df(test, pca, ~expand.grid(response, pre1 = .x, pre2 = .y))

或者这也可以用pmap_df 写成:

purrr::pmap_df(list(test, pca), ~expand.grid(response, pre1 = ..1, pre2 = ..2))

【讨论】:

    【解决方案2】:

    您希望将完整的向量 respons 传递给 pmap_dfr 中的每个调用。为此,您需要创建一个包含 7 个 response 向量副本的列表。你可以这样做

    rep(list(response), 7)
    

    agrg.list 的完整结构将如下所示。

    agrg.list = list(response = rep(list(response), 7), pre1 = test, pre2 = pca)
    

    其余的将按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 2018-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多