2016-03-05 50 views
0

我已经从网上刮数据后,生成多个dataframes脚本重命名许多数据帧的多列以动态的方式R中

library("rvest") 
urllist <- c("https://en.wikipedia.org/wiki/Jawaharlal_Nehru", 
     "https://en.wikipedia.org/wiki/Indira_Gandhi") 
for(i in 1:length(urllist)) 
{ mydata <- urllist[i] 
    print(url) 
    mydata<- url %>% 
    html() %>% 
    html_nodes(xpath='//*[@id="mw-content-text"]/table[1]') %>% 
    html_table() 
    X <- mydata[[1]] 
    assign(paste("df", i, sep = '_'), X) 
} 

因此它创建df_1,df_2等

下载后所有此数据框有2列。第1列名称是该人员名称,第2列名称是NA。

如何将所有这些数据框列名重命名为第一列名称作为“ID”,第二列名称作为人名动态? 我的下面的尝试失败了。这正在改变这些字符串...它不影响我的数据帧。

for(i in 1:length(urllist)) 
{ asign(colnames(get(paste("df", i, sep = '_')))[1],"ID") 
    assign(colnames(get(paste("df", i, sep = '_')))[2],colnames(get(paste("df", i, sep = '_')))[1]) 
    } 

然后,我的最终目标是根据“ID”列合并所有这些数据框在一个数据框中。 可能是什么方式?

解决这样说:

for (i in (1:length(urllist))) 
{ 
    df.tmp <- get(paste("df", i, sep = '_')) 
    names(df.tmp) <- c("ID",colnames(get(paste("df", i, sep = '_')))[1]) 
    assign(paste("df",i,sep='_'), df.tmp) 
} 

用于合并我已经解决了这个办法:

#making the list without the 1st df 
alldflist = lapply(ls(pattern = "df_[2]"), get) 
#merge multiple data frames by ID 
#note at first taking the 1st df 
mergedf<-df_1 
for (.df in alldflist) 
    { 
    mergedf <-merge(mergedf,.df,by.x="ID", by.y="ID",all=T) 
} 

它的工作原理。但任何人都可以请建议一个更好的方式来为这个动态数据框的名称,并合并成一个单一的数据框

+2

您不能将data.frames存储在列表中,并使用为此设计的R方法来处理它们吗? –

+0

解决最后使用df.tmp – pmr

回答

1

在他的评论中使用列表罗马指出肯定会在这种情况下工作,但如果你已经循环你的列表为什么你不只是做使用它您最初的循环......这样的事情:

colnames(X) <- c("ID", colnames(X)[1])

这是假设您想要的第一列名是第二列名这看起来是这样的基于你的第二个循环的情况。

+0

最终使用df.tmp解决它 – pmr

+0

它取决于你,但上面的代码应该工作,并避免第二个for循环和创建临时data.frames –