R语言使用tidyverse为列表中每个tibble添加列表位置列
问题
我有一个由多个tibble对象组成的列表,需要为每个tibble新增一列,用于标记该tibble在列表中的位置序号。
示例构造代码
library(tidyverse) l <- list( tibble(x = 1:3, y = rev(x)), tibble(a = 3:1, b = rev(a)) )
原始列表输出
> l [[1]] # A tibble: 3 x 2 x y <int> <int> 1 1 3 2 2 2 3 3 1 [[2]] # A tibble: 3 x 2 a b <int> <int> 1 3 1 2 2 2 3 1 3
预期效果
为每个tibble新增list_pos列,列值为对应tibble在列表中的位置序号,输出如下:
> l [[1]] # A tibble: 3 x 3 x y list_pos <int> <int> <int> 1 1 3 1 2 2 2 1 3 3 1 1 [[2]] # A tibble: 3 x 3 a b list_pos <int> <int> <int> 1 3 1 2 2 2 2 2 3 1 3 2
实现方法
使用tidyverse中purrr包的imap函数即可完成,imap会自动将列表元素的位置索引作为第二个参数传入处理函数,不需要额外手动生成索引序列:
l <- l |> imap(\(current_tibble, pos) { mutate(current_tibble, list_pos = pos) })
如果使用R 4.1以下版本不支持简写匿名函数,可以替换为标准匿名函数写法:
l <- imap(l, function(current_tibble, pos) { mutate(current_tibble, list_pos = pos) })
运行代码后得到的列表和预期效果完全一致,每个子tibble都会新增值为自身所在位置的list_pos列。
内容的提问来源于stack exchange,提问作者MCP_infiltrator
相关产品推荐
相关产品推荐

