Добавить новый столбец к фреймам данных в списке - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть набор фреймов данных с именами df_1968, df_1969, df_1970, ..., df_2016, собранных в список под названием my_list. Я хочу добавить новый столбец в каждом из этих фреймов данных, который просто является текущим годом (1968 в df_1968 и так далее). Мне удалось сделать это, просматривая фреймы данных, но я ищу более аккуратное решение. Я пробовал следующее:

# Function to extract year from name of data frames
substrRight <- function(y,  n) {
substr(y, nchar(y) - n  + 1, nchar(y))
}

# Add variable "year" equal to 1968 in df_1968 and so on
my_list <- lapply(my_list, function(x) cbind(x, year <- as.numeric(substrRight(names(x), 4 ))))

Однако это выдает ошибку:

Error in data.frame(..., check.names = FALSE) :
  arguments imply differing numbers of rows: 18878, 7

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

Обратите внимание, что функция substrRight работает идеально и что

as.numeric(substrRight(names(x), 4 ))

дает вектор 1968-2016

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Это работает в Base-R

years <- sub(".*([0-9]{4}$)","\\1",names(my_list))
new_list <- lapply(1:length(years), function(x) cbind(my_list[[x]],year=years[x]))
names(new_list) <- names(my_list)

с этим самодельным примером данных

df_1968 = data.frame(a=c(1,2,3),b=c(4,5,6))
df_1969 = data.frame(a=c(1,2,3),b=c(4,5,6))
df_1970 = data.frame(a=c(1,2,3),b=c(4,5,6))

my_list <- list(df_1968,df_1969,df_1970)
names(my_list) <- c("df_1968","df_1969","df_1970")

Я получаю этот вывод

> new_list
$df_1968
  a b year
1 1 4 1968
2 2 5 1968
3 3 6 1968

$df_1969
  a b year
1 1 4 1969
2 2 5 1969
3 3 6 1969

$df_1970
  a b year
1 1 4 1970
2 2 5 1970
3 3 6 1970
0 голосов
/ 27 апреля 2020

Следующая функция проведет l oop через именованный список фреймов данных и создаст столбец year с 4 последними символами имен списка.
Я немного упростил функцию substrRight. Поскольку нужны последние символы, он использует substring, без необходимости указывать последнюю позицию символа.

substrRight <- function(y,  n) {
  substring(y, nchar(y) - n  + 1)
}

my_list <- lapply(names(my_list), function(x){
  my_list[[x]][["year"]] <- as.numeric(substrRight(x, 4))
  my_list[[x]]
})

Код создания данных.

my_list <- lapply(1968:1970, function(i) data.frame(a = 1:5, b = letters[1:5]))
names(my_list) <- paste("df", 1968:1970, sep = "_")
...