【问题标题】:Elementwise differences across multiple columns with dplyr使用 dplyr 跨多个列的元素差异
【发布时间】:2018-05-11 21:44:18
【问题描述】:

我的目标是创建由差异组成的新变量,但在多个列之间进行迭代。在基础上,这非常简单:

iris[, 6:7] <- iris[, 1:2] - iris[, 3:4]

有没有办法在 dplyr 中实现这一点,也许使用 mutate?

以下代码从第 1 列和第 2 列中减去第三列:

iris2 <- iris %>%
  mutate_at(1:2, funs(diffs = . - Petal.Length))

但是如果我想从第 1 次中减去第 3 次,从第 4 次中减去第 2 次怎么办?

我正在使用相当大的数据应用程序,所以为什么不假设我正在尝试跨 1000 列的表进行此操作 - 手动破解并不可取...

【问题讨论】:

  • 您是在寻找比基础更快的东西,还是只是将代码放入管道?
  • 我认为你的问题不清楚。说出你从 1 中减去 3 的困难是什么?
  • 我只是想知道 dplyr 是否有这方面的工具。我认为 Calum You 的以下解决方案有效,但如果有一种好方法可以让变异动词发挥作用,那就太好了。

标签: r dplyr data-science


【解决方案1】:

这是使用dplyr::bind_colspurrr::map2 的一种方法,它在大量列时似乎比base 快得多。我对分析的了解不足,无法猜测原因,因为它比其他选项感觉更复杂。我不确定使用mutate_ 动词是否容易做到这一点,尽管可以更正。

编辑:添加了一个带有dplyr::do 的选项,这是进行计算的“预期”方式,它不能完全适合mutate 函数。 mutate 的问题在于它希望只创建一列。我认为除了使用 map 来构造单独的 mutate 调用(我无法想象它会更快)之外,这是最好的选择。

library(tidyverse)
set.seed(4321)
df <- matrix(rnorm(1000000), ncol = 1000) %>%
  as_tibble()

microbenchmark::microbenchmark(
  base = df[, 1001:1500] <- df[, 1:500] - df[, 501:1000],
  base2 = df %>% magrittr::inset(, 1001:1500, .[, 1:500] - .[, 501:1000]),
  map =  df %>% bind_cols(map2(.x = .[, 1:500], .y = .[, 501:1000], .f = ~.x - .y)),
  nomap = df %>% bind_cols(.[, 1:500] - .[, 501:1000]),
  do = df %>% do(.[, 1:500] - .[, 501:1000])
)
#> Unit: milliseconds
#>   expr       min        lq      mean    median        uq       max neval
#>   base 32.928171 36.394238 39.362308 37.361149 39.454822 112.76356   100
#>  base2 33.302556 35.500491 38.888530 37.433863 40.207799  84.08674   100
#>    map  4.693637  5.139985  5.967655  5.468398  6.264793  12.20658   100
#>  nomap 23.061348 25.016053 28.598282 26.973913 29.574478  79.97451   100
#>     do 21.906042 23.460822 27.049262 25.135640 26.596373  80.01928   100
#>  cld
#>    c
#>    c
#>  a  
#>   b 
#>   b

reprex package (v0.2.0) 于 2018 年 5 月 11 日创建。

【讨论】:

    猜你喜欢
    • 2015-08-26
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    相关资源
    最近更新 更多