列 dplyr 的 row_number 等价物

Posted

技术标签:

【中文标题】列 dplyr 的 row_number 等价物【英文标题】:Equivalent of row_number for columns dplyr 【发布时间】: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 来做,一般能够获得列的索引。举个更复杂的例子。

有什么想法吗?

【问题讨论】:

【参考方案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'))

【讨论】:

以上是关于列 dplyr 的 row_number 等价物的主要内容,如果未能解决你的问题,请参考以下文章

什么是 R 中 plyr::ldply(tapply) 的 dplyr 等价物?

R语言dplyr包排序及序号函数实战(row_numberntilemin_rankdense_rankpercent_rankcume_dist)

R删除数据列基于dplyr包

R语言dplyr包pull函数抽取dataframe数据列实战

R语言使用dplyr将特定的数据列移动到最前面使用dplyr将特定数据列移动到另一指定数据列的后面使用dplyr将特定数据列移动到另一指定数据列的前面

如何使用 dplyr 将累积列添加到 R 数据框?