将在线.csv文件合并到R中的数据框中

时间:2015-12-05 00:16:03

标签: r url for-loop download dataframe

我需要在线下载300多个.csv文件,并将它们合并到 R 的数据框中。它们都具有相同的列名,但长度(行数)不同。

l<-c(1441,1447,1577)
s1<-"https://coraltraits.org/species/"
s2<-".csv"

for (i in l){   
    n<-paste(s1,i,s2, sep="") #creates download url for i
    x <- read.csv( curl(n) ) #reads download url for i
    #need to sucessively combine each of the 3 dataframes into one 
}

2 个答案:

答案 0 :(得分:5)

就像@RohitDas所说,不断追加数据帧是非常低效的,并且会很慢。只需将每个csv文件作为列表中的条目下载,然后在收集列表中的所有数据后绑定所有行。

l <- c(1441,1447,1577)
s1 <- "https://coraltraits.org/species/"
s2 <- ".csv"

# Initialize a list
x <- list()

# Loop through l and download the table as an element in the list    
for(i in l) {   
    n <- paste(s1, i, s2, sep = "") # Creates download url for i
    # Download the table as the i'th entry in the list, x
    x[[i]] <- read.csv( curl(n) ) # reads download url for i
}

# Combine the list of data frames into one data frame
x <- do.call("rbind", x)

只是一个警告:x中的所有数据框都必须具有相同的列才能执行此操作。如果x中的某个条目具有不同的列数或不同名称的列,则rbind将失败。

在几个不同的包中存在更高效的行绑定函数(带有一些额外内容,例如列填充)。看一下这些绑定行的解决方案:

  • plyr::rbind.fill()
  • dplyr::bind_rows()
  • data.table::rbindlist()

答案 1 :(得分:1)

如果它们具有相同的列,则只需添加行即可。一种简单(但不是内存有效)的方法是在循环中使用rbind

l<-c(1441,1447,1577)
s1<-"https://coraltraits.org/species/"
s2<-".csv"

data <- NULL
for (i in l){   
    n<-paste(s1,i,s2, sep="") #creates download url for i
    x <- read.csv( curl(n) ) #reads download url for i
    #need to sucessively combine each of the 3 dataframes into one 
    data <- rbind(data,x)
}

更有效的方法是建立一个列表,然后在最后将它们组合成一个数据框,但我会把它作为练习留给你。

相关问题
最新问题