如何使用 R 中的 paste0() 将列添加到数据框列表?

How do I add columns to a list of dataframes using paste0() in R?

我有一个名为 list_of_sheets 的 2 个数据帧的列表。这些数据框是来自 Excel 个具有相同列名的工作表的数据。以下是相关列的快照。

List of 2
 $ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   242 obs. of  43 variables:
  ..$ Market Section     : num [1:242] 559286 559287 559286 559287 559287 ...
  ..$ Market Section Name: chr [1:242] "DOMESTIC BULK CUSTOMER MARKET SECTION" "INTERNATIONAL BULK MARKET SECTION" "DOMESTIC BULK CUSTOMER MARKET SECTION" "INTERNATIONAL BULK MARKET SECTION" ...
  ..$ JDE Branch Plant   : chr [1:242] "PBK0100" "PBK0200" "PBK0200" "PNR0100" ...
  ..$ Short Item Code    : num [1:242] 2085010 1782171 1782059 1823261 1934471 ...
  ..$ Long Item Code     : chr [1:242] "016144" "637524" "554326" "149226" ...

我正在尝试创建一个 Key 列,它将 JDE Branch Plant、Long Item Code 和 Market Section 列串联起来。

以下是我尝试过的一些方法。我是 R 的初学者,我对使用 apply() 函数和处理列表的知识有限,所以我很感激提供的任何帮助。我想我对那些更有经验的人犯了一个明显的错误。

list_of_sheets <- mapply(cbind, list_of_sheets, "Key" = paste0(`JDE Branch Plant`, `Long Item Code`, `Market Section`))

for (i in seq_along(list_of_sheets)) {
  list_of_sheets[[i]]$Key <- paste0(`JDE Branch Plant`, `Long Item Code`, `Market Section`)

  }

对于这两个,我都收到以下错误。

Error in paste0(`JDE Branch Plant`, `Long Item Code`, `Market Section`) : 
  object 'JDE Branch Plant' not found

我相信也可能有 purrr 解决方案,但我对这个包了解不多。 如果有人推荐资源来深入理解 R 中的 apply 和 purrr 函数,我也将不胜感激。

因为它是 tbl_df,我们可以使用 tidyverse 方法,即用 map 遍历 list,通过 [ 创建 'Key' 列=18=] 在指定 remove = FALSE 的同时对相关列进行处理(如果不再需要这些列,默认情况下为 remove = TRUE

library(dplyr)
library(purrr)
library(tidyr)
list_of_sheets2 <- list_of_sheets %>%
     map(~ .x %>%
                unite(Key, `JDE Branch Plant`,
             `Long Item Code`, `Market Section`, remove = FALSE, sep=""))

在 OP 的代码中,问题在于它只是 pasteing 列名而不是这些列中的值。我们可以使用 [[

提取每个数据集的列
for (i in seq_along(list_of_sheets)) {
    list_of_sheets[[i]]$Key <- paste0( list_of_sheets[[i]][["JDE Branch Plan"]],  
     list_of_sheets[[i]][["Long Item Code"]], 
     list_of_sheets[[i]][["Market Section"]])

 }

或者可以使用 with

使其更短一些
for (i in seq_along(list_of_sheets)) {
    list_of_sheets[[i]]$Key <-
         with(list_of_sheets[[i]], paste0(`JDE Branch Plant`,
          `Long Item Code`, `Market Section`))

   }

OP 也尝试使用 mapply 并遇到同样的问题。在这种情况下,我们不需要 mapply 因为 Map/mapply 用于对相应元素进行转换。在这里,每个 list 元素都有相同的列,并且需要对这些相同的列进行转换。相反,它可以用 lapply

来完成
list_of_sheets2 <- lapply(list_of_sheets, transform,
        Key = paste0(`JDE Branch Plant`, `Long Item Code`, `Market Section`))