我有一个数据帧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
中的数据帧不会被重命名,也不会显示错误。
非常感谢您的帮助!如果您需要更多信息,我会进行编辑。
答案 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