如何在r中的列表中跨数据帧选择列



在确信使用列表管理R中的多个数据帧是最佳实践后,我决定将所有具有相同列名的数据帧放入列表中。

示例列表:

#create sample df
df_1 <- data.frame(item = c("a", "b", "c"), 
measure = c(1,2,3)
)
df_2 <- data.frame(item = c("x", "y", "z"), 
measure = c(4,5,6)
)
#use names as my df has names
data_list <- list(df_1 = df_1, df_2 = df_2)

我想在这些数据帧上执行相同的操作,但我不希望它们组合为一个数据帧,因为稍后我需要将每个数据帧保存到单独的输出中。

然后它变成了一场噩梦,因为我不知道如何在列表中的所有数据帧中操作列。

虽然我们可以在列表中选择特定的元素和特定的df,但我们如何通过列名进行选择?

举个例子,我需要将item列中的值更改为大写。在数据帧中,我将进行

df_1 <- df_1 %>% mutate(item = toupper(item))

我仍在学习编写函数和使用R中的应用程序族。对于这个简单的任务,我相信我可以像一样使用lapply中的现有函数

data_list = lapply(x, toupper)

问题是这里的x是什么?有没有办法按列进行子集划分?就像data_list$df_1data_list[1]可以给我完整的df_1。

我希望我可以使用lapply和函数在列表中的数据帧中逐列执行方法。

另一个选项是从purrr使用map。因此,如果您已经为列表中的一个数据帧编写了想要执行的操作,那么您可以将其作为函数放入map中。使用.x而不是指定特定的数据帧。

library(tidyverse)
map(data_list, ~ .x %>%
mutate(item = toupper(item)))

输出

$df_1
item measure
1    A       1
2    B       2
3    C       3
$df_2
item measure
1    X       4
2    Y       5
3    Z       6

最新更新