如何使用 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 的代码中,问题在于它只是 paste
ing 列名而不是这些列中的值。我们可以使用 [[
提取每个数据集的列
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`))
我有一个名为 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 的代码中,问题在于它只是 paste
ing 列名而不是这些列中的值。我们可以使用 [[
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`))