【问题标题】:Write data frame to multiple csv's in R将数据帧写入R中的多个csv
【发布时间】:2017-09-18 16:09:46
【问题描述】:

我有以下数据框,其中包含有关不同状态的信息。

long=c(-106.61291,-106.61291,-106.61291,-81.97224,-81.97224,-81.97224,-84.4277,-84.4277,-84.4277)
lat=c(35.04333,35.04333,35.04333,33.37378,33.37378,33.37378,33.64073,33.64073,33.64073)
city=c("Albuquerque","Albuquerque","Albuquerque","Augusta","Augusta","Augusta","Atlanta","Atlanta","Atlanta")
date=c("2017-08-22","2017-08-23","2017-09-24","2017-09-28","2017-10-24","2017-09-22","2017-11-12","2017-010-14","2017-09-03")
value=c(12,10.8,18.3,12.4,43,21,12,32.1,14)

df<-data.frame(long,lat,city,date,value)

问题:我想将每个城市信息写在单独的 csv 中。每个 csv 应该看起来 如下所示。 最终输出:

Albuquerque.csv
       long      lat        city       date value
1 -106.6129 35.04333 Albuquerque 2017-08-22  12.0
2 -106.6129 35.04333 Albuquerque 2017-08-23  10.8
3 -106.6129 35.04333 Albuquerque 2017-09-24  18.3

Augusta.csv
      long      lat    city       date value
1 -81.97224 33.37378 Augusta 2017-09-28  12.4
2 -81.97224 33.37378 Augusta 2017-10-24  43.0
3 -81.97224 33.37378 Augusta 2017-09-22  21.0

Atlanta.csv
      long      lat    city        date value
1 -84.4277 33.64073 Atlanta  2017-11-12  12.0
2 -84.4277 33.64073 Atlanta 2017-010-14  32.1
3 -84.4277 33.64073 Atlanta  2017-09-03  14.0

提前致谢!

【问题讨论】:

标签: r csv


【解决方案1】:
# Split dataframe by city
split_df <- split(df, list(df$city))

# Write out separate CSV for each city
for (city in names(split_df)) {
    write.csv(split_df[[city]], paste0(city, ".csv"))
}

【讨论】:

  • 感谢@Scott Warchal!
【解决方案2】:
long=c(-106.61291,-106.61291,-106.61291,-81.97224,-81.97224,-81.97224,-84.4277,-84.4277,-84.4277)
lat=c(35.04333,35.04333,35.04333,33.37378,33.37378,33.37378,33.64073,33.64073,33.64073)  
city=c("Albuquerque","Albuquerque","Albuquerque","Augusta","Augusta","Augusta","Atlanta","Atlanta","Atlanta")
date=c("2017-08-22","2017-08-23","2017-09-24","2017-09-28","2017-10-24","2017-09-22","2017-11-12","2017-010-14","2017-09-03")
value=c(12,10.8,18.3,12.4,43,21,12,32.1,14)

df<-data.frame(long,lat,city,date,value)

dflist <- split(df , f = df$city)

sapply(names(dflist), 
 function (x) write.csv(dflist[[x]], file=paste(x, "csv", sep=".") )   )

【讨论】:

  • 也许使用write.csv() 更明确。
【解决方案3】:

有几种不同的方法可以做到这一点,但同时为所有城市做到这一点的一种非常快速的方法是利用基础 R 中的 apply 系列函数 - 特别是 lapply

long=c(-106.61291,-106.61291,-106.61291,-81.97224,-81.97224,-81.97224,-84.4277,-84.4277,-84.4277)
lat=c(35.04333,35.04333,35.04333,33.37378,33.37378,33.37378,33.64073,33.64073,33.64073)
city=c("Albuquerque","Albuquerque","Albuquerque","Augusta","Augusta","Augusta","Atlanta","Atlanta","Atlanta")
date=c("2017-08-22","2017-08-23","2017-09-24","2017-09-28","2017-10-24","2017-09-22","2017-11-12","2017-010-14","2017-09-03")
value=c(12,10.8,18.3,12.4,43,21,12,32.1,14)

df<-data.frame(long,lat,city,date,value)

# create a convenience function to split your data and export to csv
split_into_csv <- function(x) {
tmp <- df[df$city == x,]
write.csv(tmp, file = paste0(x,".csv"))}

# Apply split_into_csv over elements of list with lapply
lapply(levels(df$city), split_into_csv)
# Check output in director
dir()
[1] "Albuquerque.csv" "Atlanta.csv"     "Augusta.csv"  

【讨论】:

    【解决方案4】:

    您可以使用 base R 或 dplyr 包来做到这一点。

    dplyr 方式:

    dplyr::filter(df, city == 'Albuquerque') %>% write.csv(file = 'Albuquerque.csv', row.names = FALSE)
    dplyr::filter(df, city == 'Augusta') %>% write.csv(file = 'Augusta.csv', row.names = FALSE)
    dplyr::filter(df, city == 'Atlanta') %>% write.csv(file = 'Atlanta.csv', row.names = FALSE)
    

    基础R:

    write.csv(df[df$city == 'Albuquerque', ], file = 'Albuquerque.csv', row.names = FALSE)
    write.csv(df[df$city == 'Augusta', ], file = 'Augusta.csv', row.names = FALSE)
    write.csv(df[df$city == 'Atlanta', ], file = 'Atlanta.csv', row.names = FALSE)
    

    如果您开始获取更多城市,您可以使用 for 循环。

    for (city in c('Albuquerque', 'Augusta', 'Atlanta')) {
      write.csv(df[df$city == city, ], file = paste0(city, '.csv'))
    }
    

    【讨论】:

    • 我还有100多个城市。
    • 然后使用 for 循环: for (city in c('Albuquerque', 'Augusta', 'Atlanta')) { write.csv(df[df$city == city, ], file = paste0(city, '.csv')) }
    • 用包含您的城市名称的向量替换 c('Albuquerque', 'Augusta', 'Atlanta')
    • 谢谢@charlesdarwin!!
    猜你喜欢
    • 2014-12-29
    • 2019-09-20
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 2022-01-08
    相关资源
    最近更新 更多