当前位置: 首页 > 知识库问答 >
问题:

在c(…)中使用pmap第2部分

韦鸣
2023-03-14

最近我一直在探索使用pmap函数及其变体的各种应用,我特别感兴趣的是使用c(...)将所有参数传递到。下面的数据集属于我们今天早些时候与多位非常有知识的用户讨论的另一个问题。我们应该根据days列中的值沿着它们各自的行重复weight列中的值,以获得以下输出:

df <- tribble(
  ~Name,    ~School,   ~Weight, ~Days,
  "Antoine", "Bach",     0.03,   5,
  "Antoine", "Ken",      0.02,   7,
  "Barbara", "Franklin", 0.04,   3
)

输出:

df %>%
  mutate(map2_dfr(Weight, Days, ~ set_names(rep(.x, .y), 1:.y))) %>%
  select(-c(Weight, Days))

# A tibble: 3 x 9
  Name    School     `1`   `2`   `3`   `4`   `5`   `6`   `7`
  <chr>   <chr>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Antoine Bach      0.03  0.03  0.03  0.03  0.03 NA    NA   
2 Antoine Ken       0.02  0.02  0.02  0.02  0.02  0.02  0.02
3 Barbara Franklin  0.04  0.04  0.04 NA    NA    NA    NA 

# This is not my code and it works:

pmap_dfr(df, function(Weight, Days, ...) c(..., setNames(rep(Weight, Days), 1:Days)))

# And I can also rewrite it in the following way which also works:

df %>%
  mutate(data = pmap(list(Weight, Days), ~ setNames(rep(.x, .y), 1:.y))) %>%
  unnest_wider(data)

df %>% 
  mutate(pmap_dfr(., ~ c(..., setNames(rep(Weight, Days), 1:Days))))


df %>% 
  pmap_dfr(., ~ c(..., setNames(rep(Weight, Days), 1:Days)))

非常感谢您的提前和非常抱歉的冗长的描述。

共有1个答案

凌钊
2023-03-14

问题似乎是将自定义匿名/lambda函数(函数(Weight,Days,...)-其中参数的名称与列名相同)与默认lambda函数(~-其中参数为.x,.y(如果只有两个元素或如果超过两个元素)-..1,..2,..3等)混合在一起。在行动的代码中

library(dplyr)
library(purrr)
df %>% 
   mutate(pmap_dfr(., ~ c(..., setNames(rep(Weight, Days), 1:Days))))

“weight”和“days”返回原始数据集中的完整列值,而不是从行返回。如果我们希望仍然使用上述命令,则需要将每一行中捕获的数据转换为tibble并将一起使用

df %>%
     pmap_dfr(., ~ with(as_tibble(list(...)), 
             setNames(rep(Weight, Days), seq_len(Days))))
# A tibble: 3 x 7
#     `1`   `2`   `3`   `4`   `5`   `6`   `7`
#   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1  0.03  0.03  0.03  0.03  0.03 NA    NA   
#2  0.02  0.02  0.02  0.02  0.02  0.02  0.02
#3  0.04  0.04  0.04 NA    NA    NA    NA   

如果我们想要其他列,

df %>%
     pmap_dfr(., ~ c(list(...)[-(3:4)], with(as_tibble(list(...)), 
             setNames(rep(Weight, Days), seq_len(Days)))))
# A tibble: 3 x 9
#  Name    School     `1`   `2`   `3`   `4`   `5`   `6`   `7`
#  <chr>   <chr>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Antoine Bach      0.03  0.03  0.03  0.03  0.03 NA    NA   
#2 Antoine Ken       0.02  0.02  0.02  0.02  0.02  0.02  0.02
#3 Barbara Franklin  0.04  0.04  0.04 NA    NA    NA    NA   

或使用行式

library(tidyr)
df %>% 
    rowwise %>% 
    mutate(out = list(setNames(rep(Weight, Days), seq_len(Days)))) %>%
    ungroup %>%
    unnest_wider(c(out))  %>%
    select(-Weight, -Days)
# A tibble: 3 x 9
#  Name    School     `1`   `2`   `3`   `4`   `5`   `6`   `7`
#  <chr>   <chr>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Antoine Bach      0.03  0.03  0.03  0.03  0.03 NA    NA   
#2 Antoine Ken       0.02  0.02  0.02  0.02  0.02  0.02  0.02
#3 Barbara Franklin  0.04  0.04  0.04 NA    NA    NA    NA   
 类似资料:
  • 问题内容: 我正在尝试在Swift中使用Map Kit。我尝试在地图上显示该区域,一个图钉(MKPinAnnotationView)和当前位置。所有显示正常。我尝试添加“披露按钮”并拦截其点击。添加了“披露”按钮,但无法进行拦截窃听。 具有方法的功能不起作用。 这是一个示例代码: 问题答案: 该委托方法必须命名。 您不能使用自己的名字,例如。 这适用于任何委托方法,并由协议规定。 所以应该是:

  • 我一直在通过LWP::UserAgent研究HTTPS500错误的问题。我已经用lwp:useragent尝试了500错误中的所有内容,但没有成功。 我在同一台服务器上有两个Perl库(系统和我自己的)。我自己的图书馆是最近的,但不工作。 所有这些都大于参考帖子中建议的内容。 当我运行跟踪时,我得到: 我使用了一个数据包捕获,发现它使用了安全套接字层->SSL记录层。较旧的系统库使用安全套接字层-

  • 我在一个docker容器中的Java8上运行了一个java应用程序。该过程启动Jetty9服务器,并部署web应用程序。传递以下JVM选项:。 最近我注意到该过程消耗了大量内存:

  • 本教程上接 教程 第1部分 。 我们将继续开发 Web-poll 应用,并且专注在 Django 的 自动生成的管理网站上。 哲理 为你的员工或客户生成添加、修改和删除内容的管理性网站是个单调乏味的工作。 出于这个原因,Django 根据模型完全自动化创建管理界面。 Django 是在新闻编辑室环境下编写的,“内容发表者”和“公共”网站之间有 非常明显的界线。网站管理员使用这个系统来添加新闻、事件

  • 使用 HTTP 基本身份验证和 ConfigSlurper 在本期 实战 Groovy 文章中,Scott Davis 将继续构建 第 1 部分 中的 Groovy Twitter 客户机:Gwitter。这次,他将解决 HTTP Basic 身份验证问题,并使用 Groovy 的 ConfigSlurper 读入配置设置。 在 “SwingBuilder 和 Twitter API,第 1 部分

  • 更多一键式部署模式 Java™部署常常很混乱,容易出现错误,需要许多手工操作,这会延误向用户交付软件的时间。本文是分两部分的让开发自动化系列文章的第 2 部分。在本文中,自动化专家 Paul Duvall 进一步补充用于开发可靠、可重复且一致的部署流程的一些关键模式,帮助读者为 Java 应用程序生成简便的部署。 关于本系列 作为开发人员,我们致力于为用户自动化流程;但许多开发人员疏忽了自动化我们