我们可以使用purr::map()来*就地*修改嵌套结构中的字符串吗?

我们可以使用purr::map()来*就地*修改嵌套结构中的字符串吗?,r,purrr,tibble,R,Purrr,Tibble,我有一个可以嵌套命名列表的TIBLE。我想在命名列表上应用清理功能(例如,janitor::make_clean_names()),包括名称和值。基于我对purrr包的基本理解,我认为map()适合这样的任务 但是,我不知道如何执行这样的清理,类似于dplyr的mutate(跨越(…)的功能 例子 下面是一个tibble示例: 库(TIBLE) 我的桌子:4 x 2 #>姓名信息 #> #>1经济学 #>2历史 #>3心理学 #>4生物学 由(v0.3.0

我有一个可以嵌套命名列表的TIBLE。我想在命名列表上应用清理功能(例如,
janitor::make_clean_names()
),包括名称和值。基于我对
purrr
包的基本理解,我认为
map()
适合这样的任务

但是,我不知道如何执行这样的清理,类似于
dplyr
mutate(跨越(…)
的功能

例子 下面是一个tibble示例:

库(TIBLE)
我的桌子:4 x 2
#>姓名信息
#>                   
#>1经济学
#>2历史
#>3心理学
#>4生物学
由(v0.3.0)于2021-02-04创建

当我们查看
info
list列时,我们看到它嵌套了4个列表(一个为空),这些列表被命名

库(dplyr)
拉动(我的表格、信息)
## [[1]]
##[[1]]$GDP
##[1]“国内生产总值”
##[[1]]$GNI
##[1]“国民总收入”
## [[2]]
##空的
## [[3]]
##[[3]]$完形
##[1]“感知理论”
##[[3]]$`情感神经科学`
##[1]“情绪的神经机制研究”
##[[3]]$Personality
##[1]“个性及其在个体间的变异”
## [[4]]
##[[4]]$
##[1]“将光能转换为化学能”
我想做一个简单的文本清理,而
看门人::make_clean_names()
非常适合这项任务。如何对
info
下列表中的名称和值应用
make_clean_names()
,并返回相同的
my_tible
(但现在使用干净的字符串)

所需输出


my_tible_cleaned您可以分别清理名称和值,并将它们组合在一起

library(janitor)
library(dplyr)
library(purrr)

result <- my_tibble %>%
            mutate(info = map(info, ~setNames(map(.x, make_clean_names), 
                                             make_clean_names(names(.x)))))

您可以分别清理名称和值,并将它们组合在一起

library(janitor)
library(dplyr)
library(purrr)

result <- my_tibble %>%
            mutate(info = map(info, ~setNames(map(.x, make_clean_names), 
                                             make_clean_names(names(.x)))))
我们可以使用

library(dplyr)
library(purrr)
library(janitor)
my_tibble %>%
           mutate(info = map(info, ~set_names(map(.x, make_clean_names), 
                                         make_clean_names(names(.x)))))
我们可以使用

library(dplyr)
library(purrr)
library(janitor)
my_tibble %>%
           mutate(info = map(info, ~set_names(map(.x, make_clean_names), 
                                         make_clean_names(names(.x)))))

谢谢由此我了解到,
mutate(跨越(…)
不应该在这里工作。对吗?我只是想考虑一下它的可伸缩性。如果我想在嵌套命名列表的许多列表列上应用这样的解决方案,该怎么办?
用于将函数应用于多个列。这里我们只有一列(
info
),因此不需要跨列。如果您需要在这种情况下将其应用于多列,您可以跨使用
。我明白了。那么我应该在我的数据示例中提供几个列表列。无论如何,我已经根据我在发布问题时的想法调整了您的解决方案:
my_tible%>%mutate(跨越(信息,~map(,~setNames(map(.x,make_clean_name),make_clean_name(name(.x)))
谢谢!由此我了解到,
mutate(跨越(…)
不应该在这里工作。对吗?我只是想考虑一下它的可伸缩性。如果我想在嵌套命名列表的许多列表列上应用这样的解决方案,该怎么办?
用于将函数应用于多个列。这里我们只有一列(
info
),因此不需要跨列。如果您需要在这种情况下将其应用于多列,您可以跨使用
。我明白了。那么我应该在我的数据示例中提供几个列表列。无论如何,我已经根据我在发布问题时的想法调整了您的解决方案:
my_tible%>%mutate(跨越(信息,~map(,~setNames(map(.x,make_clean_name),make_clean_name(name(.x);))