Добавьте разные суффиксы к именам столбцов в нескольких фреймах данных в R - PullRequest
1 голос
/ 04 февраля 2020

Я пытаюсь добавить различные суффиксы к своим фреймам данных, чтобы я мог различить guish после их объединения. У меня есть свои фреймы данных в списке и я создал вектор для суффиксов, но пока я не добился успеха.

data2016 - список, содержащий мои 7 фреймов данных

new_names <- c("june2016", "july2016", "aug2016", "sep2016", "oct2016", "nov2016", "dec2016")
data2016v2 <- lapply(data2016, paste(colnames(data2016)), new_names)

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

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

df1x <- data.frame(v1 = rnorm(50),
                   v2 = runif(50))
df2x <- data.frame(v3 = rnorm(60),
                   v4 = runif(60))
df3x <- data.frame(v1 = rnorm(50),
                   v2 = runif(50))
df4x <- data.frame(v3 = rnorm(60),
                   v4 = runif(60))

Предположим, что в дальнейшем вы собираете их в список, что-то похожее на ваши data2016, используя mget и ls и описывает шаблон для их соответствия:

my_list <-  mget(ls(pattern = "^df\\d+x$"))

Имена данных в этом списке следующие:

names(my_list)
[1] "df1x" "df2x" "df3x" "df4x"

Решение 1 :

Предположим, вы хотите изменить имена фреймов данных таким образом:

new_names <- c("june2016", "july2016","aug2016", "sep2016")

Тогда вы можете просто присвоить new_names names(my_list):

names(my_list) <- new_names

И результат:

names(my_list)
[1] "june2016" "july2016" "aug2016"  "sep2016"

Решение 2 :

Вы хотите добавить new_names буквально в качестве суффиксов к «старым» именам, в этом случае вы бы используйте paste или paste0 таким образом:

names(my_list) <- paste0(names(my_list), "_", new_names)

И результат:

names(my_list)
[1] "df1x_june2016" "df2x_july2016" "df3x_aug2016"  "df4x_sep2016" 
0 голосов
/ 05 февраля 2020

Вы можете использовать индексный номер в пределах lapply для ссылки как на список, так и на ваш вектор суффиксов. Поскольку есть пара шагов, я заверну процесс в function(). (Называется анонимной функцией , потому что мы не присваиваем ей имя.)

data2016v2 <- lapply(1:7, function(i) {
  this_data <- data2016[[i]] # Double brackets for a list
  names(this_data) <- paste0(names(this_data), new_names[i]) # Single bracket for vector
  this_data # The renamed data frame to be placed into data2016v2
})

Обратите внимание, что в строке paste0() мы перерабатываем термин в new_names[i], поэтому например, если new_names[i] равно "june2016", а у вашего первого data.frame есть столбцы "A", "B" и "C", то это даст вам следующее:

> paste0(c("A", "B", "C"), "june2016")
[1] "Ajune2016" "Bjune2016" "Cjune2016"

(вы можете захотеть добавить туда подчеркивание?)

Как бы там ни было, звучит так, как будто вы могли бы лучше использовать добавление "june2016" в качестве столбца в ваших данных (как, скажем, переменная с именем month с * 1023) * в качестве значения в каждой строке) и объедините ваши данные, используя что-то вроде bind_rows() из пакета dplyr, запустив его "long" вместо "wide".

...