Как добавить столбцы в список фреймов данных, используя paste0 () в R? - PullRequest
1 голос
/ 30 января 2020

У меня есть список из двух фреймов данных, который называется list_of_sheets. Эти кадры данных являются данными из листов 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

Я полагаю, что также может быть мурлыканье решение, но я не знаю много о пакете. Если кто-то порекомендует ресурсы для глубокого понимания функций apply и purrr в R, я был бы также признателен за это.

1 Ответ

1 голос
/ 30 января 2020

Поскольку это tbl_df, мы можем использовать tidyverse подходы, т.е. l oop над list с map, создать столбец «Ключ», unite, используя соответствующие столбцы, указав при этом 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=""))

В коде ОП проблема заключается в том, что он просто paste имена столбцов вместо значений в этих столбцах. Мы можем извлечь столбцы каждого набора данных с помощью [[

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`))

   }

ОП также пробовал с mapply и имел такую ​​же проблему. В этом случае нам не нужно mapply, поскольку Map/mapply используются для преобразований с соответствующими элементами. Здесь каждый элемент list имеет одинаковый столбец и нуждается в преобразовании для тех же столбцов. Вместо этого это можно сделать с помощью lapply

list_of_sheets2 <- lapply(list_of_sheets, transform,
        Key = paste0(`JDE Branch Plant`, `Long Item Code`, `Market Section`))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...