列 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)
可能还有其他方法也可以,没有多想(需要先转换为矩阵,否则不会产生正确的结果,我真的不知道为什么)。
但我想用mutate
或apply
来做,一般能够获得列的索引。举个更复杂的例子。
有什么想法吗?
【问题讨论】:
【参考方案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.table
shift
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包pull函数抽取dataframe数据列实战
R语言使用dplyr将特定的数据列移动到最前面使用dplyr将特定数据列移动到另一指定数据列的后面使用dplyr将特定数据列移动到另一指定数据列的前面