r - 使用 purrr 包重命名名称以指定字符开头的列表元素
问题描述
我有一个包含元素名称的列表,例如x.height, x.weight, y.height, y.length, z.weight, z.price
我想提取名称以开头的元素"x."
并通过删除它们的前缀来重命名这些元素"x."
。这可以分两步完成:
list.new <- list.old %>% keep(str_detect(names(.), "^x."))
names(list.new) <- str_replace(names(list.new), "x", "")
我的第一个问题:如何在管道中结合这两个步骤?
最后,我想处理所有不同前缀的"y.", "z."
列表,以获得一个新列表,其中包含重命名的子列表,例如:
List of 3
$ x:List of 2
..$ height: num 100
..$ weight: num 200
$ y:List of 2
..$ height: num 300
..$ length: num 400
$ z:List of 2
..$ weight: num 500
..$ price: num 600
是否可以使用单个管道来执行此操作?
解决方案
您可以简单地使用setNames()
or set_names()
:
list.old <- list(
x.height=1, x.weight=2, y.height=3, y.length=4, z.weight=5, z.price=6
)
list.old %>%
keep(startsWith(names(.), prefix)) %>%
set_names(str_replace(names(.), prefix, ""))
# $height
# [1] 1
#
# $weight
# [1] 2
要应用于许多前缀,请将前面的代码用作函数:
prefix_list <- c("x","y","z")
map(prefix_list,
function(prefix) list.old %>%
keep(startsWith(names(.), prefix)) %>%
set_names(str_replace(names(.), prefix, ""))
) %>%
set_names(prefix_list)
# $x
# $x$.height
# [1] 1
#
# $x$.weight
# [1] 2
#
#
# $y
# $y$.height
# [1] 3
#
# $y$.length
# [1] 4
#
#
# $z
# $z$.weight
# [1] 5
#
# $z$.price
# [1] 6
推荐阅读
- python - Python, Notion.获取关系表数据
- python - 如何使用 Mayavi 绘制 3D 复杂场的等值面以避免颜色插值伪影?
- arrays - Postgres JSON as TEXT 无法访问所需数据
- json - Postgres 在 JSON 中搜索数组
- powerbi - Power BI Embedded Analytics Client API:调用 visual.AddDataField() 时出现“FailedToValidateDataRole”
- sql - 如何将 Unix 纪元时间戳与 SQL 中的 DATE 进行比较?
- bash - 我可以将退出代码 %errorlevel% 从 WSL Bash 返回到 Powershell 或命令提示符吗?
- azure - Terraform azurerm_app_service auth_settings 新的 Azure 身份提供程序
- python - 为什么每次重新启动代码后都会删除我的 Sqlite 数据库?(Python)
- angular - ag-grid 服务器端排序/分页社区版 Angular