我正在使用一个变量列表来下载和创建R中的数据帧。我希望能够使用此列表对每个数据帧中的不同列进行更改,但是我无法使用列表调用特定列变量。
countries= c("USA","CHN")
for (i in 1:length(countries)){
download.file(url[i],savedata[i])
assign(countries[i],xmlToDataFrame(savedata[i]))
}
现在我的数据框看起来像这样:
head(USA)
indicator country date value decimal
1 GDP (current US$) United States 2012 15684800000000 0
2 GDP (current US$) United States 2011 14991300000000 0
3 GDP (current US$) United States 2010 14419400000000 0
4 GDP (current US$) United States 2009 13898300000000 0
5 GDP (current US$) United States 2008 14219300000000 0
6 GDP (current US$) United States 2007 13961800000000 0
我想进行一些更改,例如使用as.date()
函数格式化日期列,或更改值列的单位,但我希望能够执行相同的操作两个数据帧(如果我增加国家的长度,则为任意数字。
但是,每当我尝试这样做时,我似乎可以使用countries变量中的国家/地区列表来获取每个数据框的“内部”。我最初的猜测是将这样的东西放在一个循环中:
assign(paste(countries[i],"date",sep="$"),
as.date(get(paste(countries[i],"date",sep="$")))
特别是,如果我没有尝试获取特定的列日期,以及get(paste(countries[i]))
如何打印正确的名称,我对paste(countries[i],"date",sep="$")
如何工作感到困惑,但我似乎无法得到我想操纵的一栏。
另外,我意识到循环并不是理想的做法,但是我一直在使用apply函数遇到同样的问题,但由于我缺乏经验,我可能会遇到麻烦。对于如何在循环中执行或使用out的建议将非常感激。超级R新手在这里,只是想学习。另外,如果您在其他地方遇到过明确的解释/答案,我很感激您指点我。
答案 0 :(得分:1)
如果你使用列表会容易得多。从一个空的开始:
mylist = list()
然后改变这个:
assign(countries[i],xmlToDataFrame(savedata[i]))
到此:
mylist[[i]] <- xmlToDataFrame(savedata[i])
然后创建一个执行格式化的函数,例如:
f <- function(df){
within(df, date <- as.date(date))
}
并使用lapply
将其应用于所有数据框:
mylist2 <- lapply(mylist, f)
如果要按名称访问数据框,请使用:
names(mylist2) <- countries
并测试:
mylist2[["USA"]]