我有一个脚本,可以在从互联网上抓取数据后生成多个数据帧
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)
}
有效。但是,任何人都可以为这个动态数据帧名称建议一个更好的方法并合并到一个数据帧
答案 0 :(得分:1)
在他的评论中使用罗马指出的列表肯定会在这种情况下起作用,但是如果你已经在你的列表中循环,为什么不用你的初始for循环呢?像这样:
colnames(X) <- c("ID", colnames(X)[1])
这假设您希望第一个列名称是第二个列名称,看起来这是基于您的第二个循环的情况。