根据r中应用的过滤器编写多个csv文件

时间:2017-06-16 13:03:49

标签: r csv for-loop dataframe

这是我的数据框

df_temp=data.frame(ID=c(1,1,2,3,3),City=c("a","a","b","c","c"),Qty=c(20,14,40,50,60))

我想过滤唯一城市的数据并根据过滤后的结果导出该数据,并将名称作为唯一城市的名称 所以,我将拥有3个(a.csv,b.csv,c.csv)带有记录的csv文件

a.csv
ID  City Qty
1    a    20
1    a    14

b.csv
ID  City Qty
2    b    40

c.csv
ID  City Qty
3    c    50
3    c    60

这就是我试过的

name=as.character(unique(df_temp[,2]))
df_temp1=c()
for(i in df_temp[,2]){
paste("D:/Files",df_temp[i,2])
df_temp1[i]=filter(df_temp, City %in% c("a"))
write.csv("D/:Files",paste("D:/Files",name[i],".csv",sep = ""))
}

但是这给了我的" FileNa.csv"空行。 任何帮助将非常感谢..谢谢

2 个答案:

答案 0 :(得分:1)

这样的事情怎么样:

df_temp=data.frame(ID=c(1,1,2,3,3),City=c("a","a","b","c","c"),Qty=c(20,14,40,50,60))

cities <- split(df_temp, df_temp$City)

lapply(cities, function(x) write.csv(x, file=paste0("D:/Files/City_", x[1,"City"], ".txt")))

答案 1 :(得分:1)

  1. 使用?write.csv检查正确的参数:write.table(x, file = "")

  2. 如果我没有误解,那么应该首先创建数据框,而不必包括文件名的路径。

  3. 我想您想循环浏览唯一的城市名称,而不是for()循环中的每个城市名称。

  4. 请在下一个问题中使用格式正确的代码(有空格 - 您也可以咨询Google's R Style Guide)。

  5. 为什么使用=代替<-?为什么使用%in%?为什么使用filter()代替subset()? 请参阅相关的功能文档(例如:?filter表明这是适合您想要做的功能!)

  6. 以下每个城市名称将每个数据帧存储为列表元素。 它还为每个数据帧保存一个csv文件(每个数据帧对应一个不同的城市)。

    dataframe_temp = data.frame(ID = c(1, 1, 2, 3, 3), 
                                City = c("a", "a", "b", "c", "c"), 
                                Qty = c(20, 14, 40, 50, 60))
    
    dataframe.list <- list()
    
    # avoid hardcoded numbers as ", 2" as theses can 
    # change in the future, after e.g. an expansion of the dataframe!
    for (city in unique(dataframe_temp$City)) { 
    
        print(city)
    
        dataframe.list[[i]] = subset(dataframe_temp, City == city) 
    
        # use your folder location instead of "~/"
        write.csv(x = dataframe.list[[i]], file = paste0("~/", "dataframe_for_city_", city,".csv")) 
    }
    

    对于网络吝啬者,我将emilliman5的答案扩展为更大(想想用更快的速度写多GB)数据集data.table

    library(data.table)
    DT <- data.table(ID = c(1, 1, 2, 3, 3), 
                            City = c("a", "a", "b", "c", "c"), 
                            Qty = c(20, 14, 40, 50, 60))
    # setkeyv(DT, 'City') # check if you really need a key: https://stackoverflow.com/questions/20039335/what-is-the-purpose-of-setting-a-key-in-data-table
    invisible(lapply(unique(DT[, City]), function(city) 
              fwrite(x = subset(DT, City == city), 
                  file = paste0("~/", "DT_for_city_", city,".csv"))))