正在尝试在R中合并多个csv文件
我正在尝试使用R合并多个csv文件。所有csv文件都具有相同的字段,并且都是仅包含这些csv文件的共享文件夹。我已尝试使用以下代码执行此操作:正在尝试在R中合并多个csv文件,r,csv,import,R,Csv,Import,我正在尝试使用R合并多个csv文件。所有csv文件都具有相同的字段,并且都是仅包含这些csv文件的共享文件夹。我已尝试使用以下代码执行此操作: multmerge=function(mypath) { filenames=list.files(path=mypath, full.names=TRUE) datalist= lapply(filenames, function (x) read.csv(file=x, header=True)) Reduce(functio
multmerge=function(mypath) {
filenames=list.files(path=mypath, full.names=TRUE)
datalist= lapply(filenames, function (x) read.csv(file=x, header=True))
Reduce(function(x,y) merge(x,y), datalist)}
我以类似“Y:/R Practice/specdata”的方式输入路径。
当我将该函数应用于300个左右的csv文件时,确实会得到一个输出,但结果给出了我的列名,但在它下面有(或0长度的row.names)。
请让我知道,如果你有任何建议,为什么这是不工作,我可以如何修复它 您的代码对我有效,但您需要将
header=True
更改为header=True
以获得更短更快的解决方案
library(dplyr)
library(readr)
df <- list.files(path="yourpath", full.names = TRUE) %>%
lapply(read_csv) %>%
bind_rows
库(dplyr)
图书馆(readr)
df%
lapply(读取)%>%
绑定行
如果您的所有csv文件都有完全相同的字段(列名),并且您只想垂直组合它们,那么您应该使用rbind
而不是merge
:
> a
A B
[1,] 2.471202 38.949232
[2,] 16.935362 6.343694
> b
A B
[1,] 0.704630 0.1132538
[2,] 4.477572 11.8869057
> rbind(a, b)
A B
[1,] 2.471202 38.9492316
[2,] 16.935362 6.3436939
[3,] 0.704630 0.1132538
[4,] 4.477572 11.8869057
另一个已证明适用于我的设置的选项:
multmerge = function(path){
filenames=list.files(path=path, full.names=TRUE)
rbindlist(lapply(filenames, fread))
}
path <- "Dropbox/rstudio-share/dataset/MB"
DF <- multmerge(path)
我尝试使用相同的函数,但在合并函数中包含了
all=TRUE
,效果很好
我使用的代码如下:
multmerge = function(mypath){
filenames=list.files(path=mypath, full.names=TRUE)
datalist = lapply(filenames, function(x){read.csv(file=x,header=T)})
Reduce(function(x,y) {merge(x,y,all = TRUE)}, datalist)
}
full_data = multmerge("path_name for your csv folder")
希望这有帮助。
干杯 让我给你我所拥有的最好的:
library(pacman)
p_load(doParallel,data.table,dplyr,stringr,fst)
# get the file name
dir() %>% str_subset("\\.csv$") -> fn
# use parallel setting
(cl = detectCores() %>%
makeCluster()) %>%
registerDoParallel()
# read and bind
system.time({
big_df = foreach(i = fn,
.packages = "data.table") %dopar% {
fread(i,colClasses = "chracter")
} %>%
rbindlist(fill = T)
})
# end of parallel work
stopImplicitCluster(cl)
只要您的计算机中有更多的内核,这应该会更快。如果您处理的是大数据,则最好使用。组合多个CSV文件:
库(plyr)
veri对于任何拥有多个具有相同标题的CSV的人(我有~1000个),这里有一种更快的方法,可以避免单独解析CSV
filenames <- list.files(path=mypath, full.names=TRUE)
#read the files in as plaintext
csv_list <- lapply(filenames , readLines)
#remove the header from all but the first file
csv_list[-1] <- sapply(csv_list[-1], "[", 2)
#unlist to create a character vector
csv_list <- unlist(csv_list)
#write the csv as one single file
writeLines(text=csv_list,
con="all_my_csvs_combined.csv")
)
#read the csv as one single file
all_my_csvs_combined <- read.csv("all_my_csvs_combined.csv")
文件名输出文件时是否有任何警告?您对它们使用了正确的编码吗?没有,没有警告。一切进展顺利。只是输出只是我的列名,所以你知道我得到的输出是什么意思吗?另外,感谢您的回复。我创建了一个文件夹,其中包含了与您描述的列名相同的.csv
文件,然后使用上面提到的更改运行您的代码,这样可以合并所有.csv
文件。所以我不能重现你的错误@不过,Maiasaura的代码是一个更好的解决方案。谢谢你的回复。我尝试了你的解决方案。也许我没有正确地使用它,但是在将代码复制并粘贴到我的控制台之后,我想到了“有50个或更多的警告(使用warnings()查看前50个)”。所有的问题都与解析有关,如果这对您有任何意义的话。谢谢。请注意,df
是R中的默认函数。可能重命名为d
pasing问题可以通过更改函数参数来解决。我在dplyr代码中找不到如何实现它,所以我在dplyr块中创建了一个不同的函数:readmeta简洁版的其他东西。这可能很明显,但如果您想知道最终合并的csv
在哪里,它实际上在数据帧df
中。您需要使用此write.csv(df,“newmergedfile.csv”)
filenames <- list.files(path=mypath, full.names=TRUE)
#read the files in as plaintext
csv_list <- lapply(filenames , readLines)
#remove the header from all but the first file
csv_list[-1] <- sapply(csv_list[-1], "[", 2)
#unlist to create a character vector
csv_list <- unlist(csv_list)
#write the csv as one single file
writeLines(text=csv_list,
con="all_my_csvs_combined.csv")
)
#read the csv as one single file
all_my_csvs_combined <- read.csv("all_my_csvs_combined.csv")