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

时间:2018-09-22 17:13:44

标签: r function lapply assign

我有一个数据帧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 :(得分:2)

除了使用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])))))

答案 1 :(得分:2)

使用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