lapply撤消了我之前的功能,但我不知道为什么

时间:2015-03-04 04:06:30

标签: r lapply

我希望将年份列的数据框拆分为33个不同数据框的列表。然后我想更改它,以便列表中的每年列都显示" 2015"。然后我想将每个数据帧写入一个文件,其文件标有原始年份的名称。我非常接近这样做:

hist<-read.csv("hist3.csv", skip = 9, header=TRUE)  #Read data

spt1<-split(hist, hist$year)                        #Split data

fun<-function(x){within(x, year<-2015)}             #Little function to change years

lapply(spt1, fun)                                   #Use the function on each dataframe 
                                                     #in list, looks good in console

   ###BUT here the year column changes from 2015 back to original years
lapply(names(spt1), function(x){write.table(spt1[[x]],    
   file = paste("met", x, ".met", sep = ""),append=T, 
   sep=paste(rep(" ",6), collapse=""), quote=F, row.names = FALSE,     
   col.names=FALSE)})

.csv在这里:hist3.csv

2 个答案:

答案 0 :(得分:1)

您可以尝试将输出分配给新对象(spt2)或更新旧对象(spt1),然后使用write.table

 spt2 <- lapply(spt1, fun)
 lapply(names(spt2), function(x) {write.table(spt2[[x]], 
 file = paste("met", x, ".met", sep = ""),append=T, 
 sep=paste(rep(" ",6), collapse=""), quote=F, row.names = FALSE,     
 col.names=FALSE)})

 head(read.table('met1985.met', header=FALSE),3)
 #   V1 V2   V3   V4    V5   V6
 #1 2015  1 5.26 -1.5  -9.5 0.83
 #2 2015  2 5.30 -0.7  -9.2 0.00
 #3 2015  3 5.09 -0.5 -10.0 0.37

 head(read.table('met1996.met', header=FALSE),3)
 #    V1 V2   V3    V4     V5 V6
 #1 2015  1 1.87 -0.40  -6.69  0
 #2 2015  2 4.52 -0.94 -16.70  0
 #3 2015  3 6.93 -6.50 -10.47  0

答案 1 :(得分:0)

您找到了解决方案吗?我没有机会完成代码,但这是我在思考的大纲。不同的方法。下一步是在循环中添加一行以将每年更改为2015年。

    hist <- read.csv("C:/.../hist3.csv", header=TRUE,colClasses='character')
    spt1<-split(hist, hist$year)  
    names <- names(spt1)
    for (i in names){
    assign(paste("met",i,sep="."), hist[hist$year == i,])  
    }
    head(met.1985)


    year day radn maxt mint rain
     1 1985   1 5.26 -1.5 -9.5 0.83
     2 1985   2  5.3 -0.7 -9.2    0
     3 1985   3 5.09 -0.5  -10 0.37