Как переименовать кадры данных в списке на основе значений в их столбцах с помощью lapply - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть список фреймов данных x со столбцом V1, в котором указывается страна, и V2, в котором указывается год.

Имена фреймов данных: y1, y2, y3 и т. Д.,Я хочу переименовать их, чтобы они указывали страну и год (ALBANIA1993, JAPAN2002 и т. Д.).Следующий код работает с кадрами данных индивидуально:

y1 <- as.data.frame(cbind(c("ALBANIA", "ALBANIA", "ALBANIA"), c(1999, 1999, 1999)))
y2 <- as.data.frame(cbind(c("JAPAN", "JAPAN", "JAPAN"), c(2002, 2002, 2002)))
x <- list(y1, y2)

assign(as.character(with(y1, paste0(y1$V1[1], y1$V2[1]))), y1)
assign(as.character(with(y2, paste0(y2$V1[1], y2$V2[1]))), y2)

Я пытаюсь использовать lapply, чтобы применить его ко всем кадрам данных из списка x одновременно.

Вот код:

x <- list(y1, y2)
x <- lapply(x, function(y) assign(as.character(with(y, paste0(y$V1[1], y$V2[1]))), y))

Как видите, это тот же код, что и раньше, но внутри lapply.По какой-то причине кадры данных в x не переименовываются и ошибки не отображаются.

Действительно благодарны за помощь!Я отредактирую, если вам нужна дополнительная информация.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Использование setNames

x <- lapply(x, function(x) setNames(x,nm=c(as.character(x$V1[1]),as.character(x$V2[1]))))

Если вы читаете y1, используя stringsAsFactor=FALSE, вы можете удалить as.character

0 голосов
/ 22 сентября 2018

Вместо использования assign вы можете просто переназначить имена с помощью names:

x1 <- as.data.frame(cbind(c("ALBANIA", "ALBANIA", "ALBANIA"), c(1999, 1999, 1999)))

x2 <- as.data.frame(cbind(c("JAPAN", "JAPAN", "JAPAN"), c(2002, 2002, 2002)))
x <- list(x1, x2)

theRenamer = function(input.list, ...){
  newNames = lapply(input.list,function(y) as.character(with(y, paste0(y[1,1], y[1,2])))) # get the names you want to assign
  names(input.list) = as.character(newNames) # assign them with "names"
  return(input.list) # return the list
}
x = theRenamer(x)

Эта функция может быть упрощена.

РЕДАКТИРОВАТЬ:

Да, вот одна строка:

names(x) = as.character(lapply(
    x,function(y) as.character(with(y, paste0(y[1,1], y[1,2])))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...