如何根据 lapply 列中的值重命名列表中的数据框

How to rename dataframes in list based on values in their columns with lapply

我有一个数据框列表 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 中的数据帧没有重命名,也没有显示错误。

非常感谢您的帮助!如果您需要更多信息,我会进行编辑。

您可以使用 names:

重新分配名称,而不是使用 assign
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])))))

使用setNames

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

如果您使用 stringsAsFactor=FALSE 阅读 y1,那么您可以删除 as.character