如何在 r 中的列表中 select 列跨数据框

How to select column across data frame in a list in 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)

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

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

虽然我们可以 select 列表中的特定元素和特定 df,但我们如何 select 按列名?

举个例子,我需要将 item 列中的值更改为大写。在数据框中我会做

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

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

data_list = lapply(x, toupper)

问题是这里的x是什么?有没有办法按列子集?喜欢data_list$df_1或者data_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