我有1000个文件,列名列相似。例如:
df1
DATE PRICE CLOSE
DF2
DATE PRICE CLOSE
依旧......
如果我尝试根据日期合并它们,它们会合并,但列保留了旧名称,我想在循环中重命名它们
所以合并数据集看起来像这样
Date Price Close PRICE CLOSE
我想要像
这样的东西DATE PRICE1 CLOSE1 PRICE2 CLOSE2.
有没有简单的方法呢? 我尝试了几件没有给我正确输出的东西
这是使用plyr包:
mod_join = function(mypath){
filenames=list.files(path=mypath, full.names=TRUE)
datalist = lapply(filenames, function(x){read.csv(file=x,header=T)[,c('Date','High','Low')]})
join_all(datalist,by = "Date")
}
这是在所有数据框上使用merge命令:
merge2 = function(mypath){
filenames=list.files(path=mypath, full.names=TRUE)
datalist = lapply(filenames, function(x){read.csv(file=x,header=T)[,c('Date','High','Low')]})
Reduce(function(x,y) {merge(x,y,by.x= "Date",by.y = "Date",all=T)}, datalist)}
}
我尝试使用for循环,使数据帧处于领先地位,然后使用每个数据帧进行子集化并随后进行合并,但不知何故,它不会对数据帧进行子集化:
for (i in 1:1000){
data_subset <- sprintf('data_%d',i)
mydata_subset <- data.frame(,data_subset["Date"],data_subset["High"],data_subset["DayLow"])
obj_name <- paste('subset_Pricedata',i,sep ="_")
assign(obj_name,value = mydata_subset)
}
任何帮助都会很棒。 感谢
答案 0 :(得分:2)
希望这能完成你的工作:
library(plyr)
df1 = rename(df1,c("PRICE"="PRICE1","CLOSE"="CLOSE1"))
df2 = rename(df2,c("PRICE"="PRICE2","CLOSE"="CLOSE2"))
new = merge(df1,df2,all=TRUE)
如果您遇到任何困难,请发表评论。
答案 1 :(得分:1)
这种方法怎么样? 它应该很快,因为它使用data.table及其fread-function
library(data.table)
merge2 <- function(mypath){
filenames <- list.files(path=mypath, full.names=TRUE)
fileslist <- lapply(filenames, function(nam){
# reads the file
file <- fread(nam)
setnames(file, 2, "price") # renames the second col to "price"
setnames(file, 3, "close") # third to "close"
return(file)
})
dat <- rbindlist(fileslist)
return(dat)
}
编辑
我刚刚意识到您要合并数据而不是长格式。你可以做的只是添加一个带有名称的变量到data.table&#34; file&#34;在通过添加:
返回文件之前file[, varnam := nam]
然后投出最终的data.table&#34; dat&#34;在返回之前,使用reshape2库及其dcast函数。
答案 2 :(得分:0)
我有类似的问题。这是我最终使用的内容,尽管可能有一种更清洁的方式。
函数suffix_col_names将为列的子集添加后缀。我使用它是因为我最终将第1周和第2周的数据合并到第1-10列。
#function called suffix_col_names
suffix_col_names<-function(your_df, start_col, end_col, your_str, your_sep){
for (i in start_col:end_col){
colnames(your_df)[i]<-paste(colnames(your_df)[i], sep=your_sep,your_str)
}
return(your_df)
}
#call function to rename columns in week1 and week2
week_1_data<-suffix_col_names(week1,11,24,"1",".")
week_2_data<-suffix_col_names(week2,11,24,"2",".")