【问题标题】:Equivalent of row_number for columns dplyr列 dplyr 的 row_number 等价物
【发布时间】:2019-12-09 10:53:15
【问题描述】:

我正在尝试将函数应用于 tibble 或 data.frame 的列,具体取决于列的索引。在我看来好几次,我只给一个 MWE

library(tidyverse)
test <- data.frame(a = c(1,2,3), b = c(7,8,9), c = c(3,5,6))
test <- test %>% as_tibble() %>% mutate_all( ~lead(., 2)) 

这将导致每列 2 个(仅作为示例)。但我想要的是将第一列领先 1,第二列领先 2,依此类推。做类似mutate_all(~lead(., col_number())的事情。

对于这个小例子,我知道一种方法,例如:

test <- as.matrix(test)
for (i in 1:ncol(test)){ test[,i] <- lead(test[,i], i) }

可能还有其他方法也可以,没有多想(需要先转换为矩阵,否则不会产生正确的结果,我真的不知道为什么)。

但我想用mutateapply 来做,一般能够获得列的索引。举个更复杂的例子。

有什么想法吗?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    一种选择是使用purrr::map2_df 根据列号顺序lead 每一列。

    purrr::map2_df(test, seq_along(test), dplyr::lead)
    
    # A tibble: 3 x 3
    #      a     b     c
    #  <dbl> <dbl> <dbl>
    #1     2     9    NA
    #2     3    NA    NA
    #3    NA    NA    NA
    

    我们也可以使用base R Map

    test[] <- Map(function(x, y) c(tail(x, -y), rep(NA, y)), test, seq_along(test))
    

    【讨论】:

    • 太棒了!我不知道这个seq_along 函数
    【解决方案2】:

    我们可以使用data.tableshift

    library(data.table)
    setDT(test)[, Map(shift, .SD, n = 1:3, type = 'lead')]
    #    a  b  c
    #1:  2  9 NA
    #2:  3 NA NA
    #3: NA NA NA
    

    或者使用purrr

    library(purrr)
    map2_dfr(test, 1:3, ~shift(.x,  type = 'lead'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-23
      • 2022-06-21
      • 2019-12-14
      • 2019-12-12
      • 1970-01-01
      • 2015-08-16
      • 2013-08-14
      • 2012-05-04
      相关资源
      最近更新 更多