常规数据帧也会出现问题,因此为了将其简化为基本要素,请启动一个新的 R 会话,去掉 data.table 部分并使用显示的输入,其中我们有一个 3x4 data.frame,这样我们就不用了t 混淆行和列。另请注意,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 的速度优势,那么您可能不会。