使用列表更改R中多个数据框中的列

时间:2013-08-25 23:22:35

标签: r

我正在使用一个变量列表来下载和创建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新手在这里,只是想学习。另外,如果您在其他地方遇到过明确的解释/答案,我很感激您指点我。

1 个答案:

答案 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"]]