R цикл для создания нескольких новых столбцов на основе имени информационного кадра - PullRequest
0 голосов
/ 04 марта 2019

В настоящее время я создаю сценарий R для извлечения определенных вложений электронной почты из моего почтового ящика, перетаскивания вложений в фреймы данных (с тем же именем, что и имя файла), а затем разбора имен фреймов данных в отдельные элементы, которые затем можно использоватьсоздать новые столбцы в рамках кадра данных.Затем он будет rbind-ed и, наконец, будет перенесен в таблицу SQL.

Я нахожусь на этапе, когда мне нужен цикл, чтобы зацикливаться на именах кадров данных, анализировать их и добавлять их как новые столбцы, ноЯ не могу заставить мою петлю работать.

Я привел пример моего кода ниже:

df_list <- Filter(function(x) is.data.frame(get(x)), ls())

for(i in df_list){
  i["Filename"]           <- df_list[i]
  i["Campaign_ID"]        <- sapply(strsplit(df_list[i], " "), "[", 1)
  i["Campaign_Name"]      <- str_sub(regmatches(df_list[i], regexpr("(?<=\\ )[^_]+", df_list[i], perl=TRUE)), start = 1, end = str_length(regmatches(df_list[i], regexpr("(?<=\\ )[^_]+", df_list[i], perl=TRUE))) - str_length(regmatches(df_list[i], regexpr("([A-Z]+[A-Z])[^_]+", df_list[i], perl=TRUE)))-1)
  i["Campaign_Code"]      <- regmatches(df_list[i], regexpr("([A-Z]+[A-Z])[^ -]+", df_list[i], perl=TRUE))
  i["Brand"]              <- substr(regmatches(df_list[i], regexpr("([A-Z]+[A-Z])[^ -]+", df_list[i], perl=TRUE)), start = 1, stop = 4)
  i["Campaign_Type"]      <- substr(regmatches(df_list[i], regexpr("([A-Z]+[A-Z])[^ -]+", df_list[i], perl=TRUE)), start = 5, stop = 7)
  i["Campaign_Category"]  <- substr(regmatches(df_list[i], regexpr("([A-Z]+[A-Z])[^ -]+", df_list[i], perl=TRUE)), start = 8, stop = 10)
  i["Campaign_Churn"]     <- substr(regmatches(df_list[i], regexpr("([A-Z]+[A-Z])[^ -]+", df_list[i], perl=TRUE)), start = 11, stop = 13)
  i["Product"]            <- substr(regmatches(df_list[i], regexpr("([A-Z]+[A-Z])[^ -]+", df_list[i], perl=TRUE)), start = 14, stop = 16)
  i["Version"]            <- substr(regmatches(df_list[i], regexpr("([A-Z]+[A-Z])[^ -]+", df_list[i], perl=TRUE)), start = 17, stop = 17)
  i["Segment"]            <- regmatches(df_list[i], regexpr("(?<=\\_)[^ -]+", df_list[i], perl=TRUE))
  i["Churn"]              <- regmatches(df_list[i], regexpr("(?<=\\- )[^ -]+", df_list[i], perl=TRUE))
  i["Stage"]              <- regmatches(df_list[i], regexpr("([S-S]+[a-z]+[a-z]+[a-z]+[a-z] )[^\\s]+", df_list[i], perl=TRUE))
  i["Other"]              <- str_sub(regmatches(df_list[i], regexpr("([S-S]+[a-z]+[a-z]+[a-z]+[a-z] )[^.]+", df_list[i], perl=TRUE)), start = str_length(regmatches(df_list[i], regexpr("([S-S]+[a-z]+[a-z]+[a-z]+[a-z] )[^\\s]+", df_list[i], perl=TRUE)))+2, end = str_length(regmatches(df_list[i], regexpr("([S-S]+[a-z]+[a-z]+[a-z]+[a-z] )[^.]+", df_list[i], perl=TRUE))) - str_length(regmatches(df_list[i], regexpr("\\S+(?=\\.[^.]*$)", df_list[i], perl=TRUE)))-1)
  i["Date"]               <- dmy(regmatches(df_list[i], regexpr("\\S+(?=\\.[^.]*$)", df_list[i], perl=TRUE)))
  print(i)
}

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

Для ясности я также предоставил содержимое df_list (это действительно фреймы данных - они просто называютсято же самое, что файл, из которого они были получены для анализа):

[1] "20579 Buzz Testing Nathan 1 BUZZRETJOUCHUALLA_D1A - Churned - Stage 1 Other 28-February-2019.csv"
[2] "20580 Buzz Testing Nathan 2 BUZZRETJOUCHUALLA_D1B - Churned - Stage 1 Other 28-February-2019.csv"
[3] "20581 Buzz Testing Nathan 3 BUZZRETJOUCHUALLA_D1C - Churned - Stage 1 Other 28-February-2019.csv"

Редактировать: Я подумал, что добавлю еще несколько воспроизводимых данных, которые помогут прояснить ситуацию.

`20579 Buzz Testing Nathan 1 BUZZRETJOUCHUALLA_D1A - Churned - Stage 1 Other 28-February-2019.csv` <- data.frame(ID = 000000, Code = 'ABCDE')

`20580 Buzz Testing Nathan 2 BUZZRETJOUCHUALLA_D1B - Churned - Stage 1 Other 28-February-2019.csv` <- data.frame(ID = 111111, Code = 'FGHIJ')

`20581 Buzz Testing Nathan 3 BUZZRETJOUCHUALLA_D1C - Churned - Stage 1 Other 28-February-2019.csv` <- data.frame(ID = 222222, Code = 'KLMNO')

Затем в каждом фрейме данных создайте новый столбец, используя элементы имени фрейма данных для их заполнения.Так, например, для первого кадра данных, первые 5 цифр имени кадра данных будут, например, campID.У меня уже есть разбиение строк для этих элементов, как упоминалось ранее в моем вопросе.

1 Ответ

0 голосов
/ 04 марта 2019

Поскольку у меня нет доступа к вашим данным, я постараюсь ответить на ваш вопрос в общих чертах с помощью примера фрейма данных и произвольной операции, предназначенной для представления процесса изменения столбца, который вы могли указать в цикле for.в оригинальном посте.Структура в моем решении немного отличается.Вместо использования цикла for я собираю фреймы данных в список и использую lapply для изменения именованного столбца.

df1 <- data.frame(foo = 1:5,
                  bar = c(7, NA, 22, 3, 14),
                  baz = c(T, F, F, NA, T))

df2 <- data.frame(foo = 1:5,
                  bar = c(4, NA, 9, 29, 11),
                  baz = c(T, T, F, NA, T))

df3 <- data.frame(foo = 1:5,
                  bar = c(1, 9, NA, 7, 12),
                  baz = c(F, F, F, NA, F))

dfs <- Filter(function(x) is.data.frame(get(x)), ls())

В следующей строке будет создан список, записи которого являются фреймами данных.Имена могут быть изменены с именами (df_list) <- c (<em> ваши имена здесь )

df_list <- lapply(dfs, function(x) eval(as.name(x)))

Еще раз, поскольку у меня нет ваших исходных данных, я подаю заявкупроизвольное преобразование в столбец «bar» каждого фрейма данных, чтобы проиллюстрировать, как вы можете интегрировать свои преобразования в это общее решение.Здесь я просто добавляю 1 к каждому значению, отличному от NA, в столбце «bar».Надеюсь, я не неправильно истолковываю то, что вы хотите достичь.Публиковать обновления / комментарии, если это не то, что вам нужно, или если оно не работает с вашими конкретными данными.

df_list <- lapply(1:length(df_list), function(i) {
             reps = dim(df_list[[i]])[[1]]
             df_list[[i]][ ,"bar"] <- df_list[[i]][ ,"bar"] +
               rep(1, times = reps)
             df_list[[i]]
           })

Вывод должен был представлять собой список фреймов данных с 1, добавленным к каждому не-NA элемент "бар".Вы можете добавить преобразования в другие столбцы в функции, применяемой с lapply.Если ваши фреймы данных в списке не будут работать для вас как список, вот код, который назначит преобразованные фреймы данных в списке исходным фреймам данных в глобальной среде:

assignment_fun <- function(x, y) {
  assign(x, y, envir = .GlobalEnv)
}

mapply(assignment_fun, dfs, df_list)
df1
df2
df3

Вы получите забавный вывод из строки mapply в консоли, обобщающей типы данных назначений, и если вы вызываете эти фреймы данных в глобальной среде, они теперь должны совпадать с записями в списке трансформированных фреймов данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...