r - pmap purrr 错误:参数 1 必须有名称
问题描述
我计划按行对 data.table 求和并为其添加一个常量。这段代码有什么问题。我正在专门寻找 pmap_dfr 解决方案:
library(data.table)
library(tidyverse)
temp.dt <- data.table(a = 1:3, b = 1:3, c = 1:3)
d <- 10
temp.dt %>% pmap_dfr(., sum, d) # add columns a b and c and add variable d to it
预期的输出是具有以下行的单列小标题:
13 16 19
抛出的错误:参数 1 必须有名称。
我已经能够让它与 pmap 和 pmap_dbl 一起使用,但是在使用 pmap_dfr 时它失败了。此外,我提供的示例是一个玩具示例。我希望 d 变量作为 sum 函数的输入参数,而不是稍后将 d 添加到逐行求和中。
示例我知道下面会起作用:
temp.dt %>% pmap_dbl(., sum) + d
解决方案
常规数据帧也会出现此问题,因此为了将其简化为必需品,开始一个新的 R 会话,去掉 data.table 部分并使用我们有 3x4 data.frame 的地方显示的输入,这样我们就不会混淆行和列。另请注意,这与发生问题的步骤pmap_dfr(sum, d)
相同。pmap(sum, d) %>% bind_rows
bind_rows
library(dplyr)
library(purrr)
# test input
temp.df <- data.frame(a = 1:3, b = 1:3, c = 1:3, z = 1:3)
rownames(temp.df) <- LETTERS[1:3]
d <- 10
out <- temp.df %>% pmap(sum, d) # this works
out %>% bind_rows
## Error: Argument 1 must have names
正如错误所述,问题在于out
没有名称,并且似乎不会为结果提供默认名称。例如,这将起作用——我并不是建议您一定要这样做,而只是试图通过显示使其起作用的最小更改来说明它为什么不起作用:
temp.df %>% pmap(sum, d) %>% set_names(rownames(temp.df)) %>% bind_rows
## # A tibble: 1 x 3
## A B C
## <dbl> <dbl> <dbl>
## 1 14 18 22
或者可以这样写以避免写temp.df
两次:
temp.df %>% { set_names(pmap(., sum, d), rownames(.)) } %>% bind_rows
我认为我们可以得出结论,pmap_dfr
这不是在这里使用的正确功能。
碱基R
当然,这在基础 R 中都是微不足道的,因为您可以这样做:
rowSums(temp.df) + d
## A B C
## 14 18 22
或更一般地说:
as.data.frame.list(apply(temp.df, 1, sum, d))
## A B C
## 14 18 22
或者
as.data.frame.list(Reduce("+", temp.df) + d)
## X14 X18 X22
##1 14 18 22
数据表
在 data.table 我们可以写:
library(data.table)
DT <- as.data.table(temp.df)
DT[, as.list(rowSums(.SD) + d)]
## V1 V2 V3
## 1: 14 18 22
DT[, as.list(apply(.SD, 1, sum, d))]
## V1 V2 V3
## 1: 14 18 22
另请注意,直接使用 data.table 往往比在其上粘贴另一个级别更快,因此,如果您认为通过将 data.table 与 dplyr 和 purrr 一起使用可以从 data.table 的速度中受益,那么您可能不会。
推荐阅读
- javascript - 如何使用禁用按钮提交表单
- python - 使用 cx_Oracle Python 在 DB 中插入 CSV 或 dict 数据
- azure - 如何知道用户是否选择让我登录 Azure B2C
- validation - 断言在某些登录网站上仅通过一次测试
- python-3.x - Roslibpy 客户端第二次连接失败
- c# - 前面有空格和 +123 的号码:(+123) 123 456 789 至 123456789
- spring-boot - 带有 Logback 的 Spring Boot Logger - 用于不同包的 2 个不同文件
- google-cloud-platform - 当文件上传到 GCP 存储桶(Kubeflow 1.3 多用户)时,如何运行管道?
- android - 如何在小部件中将图标添加到文本视图
- amazon-eks - EKS 中 EBS 持久卷的多重附加错误