2013-04-13 49 views
3

予加载使用CSV文件:保存XTS对象作为csv文件

data = read.csv(file="/home/stefanos/R/data_frames_new/temp2.csv", header=TRUE, sep=",") 

前4行temp2.​​csv文件是:

nodeId,battery,date,idHistoric,temperature,longitude,latitude 
3,78.00,2013-04-01 00:04:03,30163676,13.74,-3.80176,43.46192 
3,78.00,2013-04-01 00:09:01,30164278,13.67,-3.80176,43.46192 
3,78.00,2013-04-01 00:13:59,30164875,13.67,-3.80176,43.46192 

欲由节点ID组和它每15分钟查找一次温度的平均值。所以,I型:

df <- xts(x = data[, c("nodeId", "battery", "idHistoric", "temperature", "longitude", "latitude")], order.by = as.POSIXct(data[, "date"], tz = "GMT", format = "%Y-%m-%d %H:%M:%S")) 

然后:

df2 <- by(df,df$nodeId,function(x){ 
    ends <- endpoints(x, on = "minutes", k = 15) 
    xx <- period.apply(x, ends, mean) 
}) 

我的问题是,我不能写DF2为csv文件。我还没有能够这样做。 当我在屏幕上我看到了以下结构打印DF2:

/*********************************************/ 

INDICES: 3 
        nodeId battery idHistoric temperature longitude latitude 
2013-04-01 00:13:59  3 78.00000 30164276 13.69333 -3.80176 43.46192 
2013-04-01 00:28:54  3 79.00000 30166075 13.78000 -3.80176 43.46192 
[...] 
------------------------------------------------------------ 
INDICES: 4 
        nodeId battery idHistoric temperature longitude latitude 
2013-04-01 00:13:07  4 87.00000 30164172 14.42667 -3.80098 43.46199 
2013-04-01 00:28:01  4 87.33333 30165964 14.49000 -3.80098 43.46199 
------------------------------------------------------------ 
INDICES: 5 
        nodeId battery idHistoric temperature longitude latitude 
2013-04-01 00:13:31  5 83.00000 30164224 13.84667 -3.80058 43.46203 
2013-04-01 00:28:26  5 83.66667 30166018 14.06000 -3.80058 43.46203 
------------------------------------------------------------ 
INDICES: 6 
        nodeId battery idHistoric temperature longitude latitude 
2013-04-01 00:12:52  6 78.00000 30164128 13.99667 -3.79979 43.46212 
2013-04-01 00:28:52  6 79.00000 30165983 13.97333 -3.79979 43.46212 

/*********************************************/ 

所以,我怎样才能将其保存在CSV?

+2

'df2'是类“by”的列表。因为它是一个列表,你应该可以用'do.call(“rbind”,df2)'把它变成一个data.frame。但没有一个可重复的例子,我无法测试... – Roland

回答

3

您可以与您的数据做到这一点(如@Roland在评论中提及)

write.table(do.call(rbind,df2),file='test.csv') 

下面一个完整的例子。您可以使用read.zoo创建您的XTS的对象,在一个衬命令:

library(zoo) 
## you replace text= here by file=temp2.csv 
dat <- read.zoo(text='nodeId,battery,date,idHistoric,temperature,longitude,latitude 
3,78.00,2013-04-01 00:13:59,30163676,13.74,-3.80176,43.46192 
3,78.00,2013-04-01 00:28:54,30163676,13.74,-3.80176,43.46192 
4,78.00,2013-04-01 00:13:07,30164278,13.67,-3.80176,43.46192 
4,78.00,2013-04-01 00:28:01,30163676,13.74,-3.80176,43.46192 
5,78.00,2013-04-01 00:13:31,30163676,13.74,-3.80176,43.46192 
5,78.00,2013-04-01 00:28:26,30164875,13.67,-3.80176,43.46192 
6,78.00,2013-04-01 00:12:52,30164875,13.67,-3.80176,43.46192 
6,78.00,2013-04-01 00:28:52,30164875,13.67,-3.80176,43.46192',header=TRUE, 
       tz='',sep=',',index=3) 

然后创建并保存按组列表,

library(xts) 
df2 <- by(dat,dat$nodeId,function(x){ 
    ends <- endpoints(x, on = "minutes", k = 1) 
    xx <- period.apply(x, ends, mean) 
}) 

write.table(do.call(rbind,df2),file='test.csv') 

要读一遍你刚才

read.table('test.csv') 
         nodeId battery idHistoric temperature longitude latitude 
3.2013-04-01 00:13:59  3  78 30163676  13.74 -3.80176 43.46192 
3.2013-04-01 00:28:54  3  78 30163676  13.74 -3.80176 43.46192 
4.2013-04-01 00:13:07  4  78 30164278  13.67 -3.80176 43.46192 
4.2013-04-01 00:28:01  4  78 30163676  13.74 -3.80176 43.46192 
5.2013-04-01 00:13:31  5  78 30163676  13.74 -3.80176 43.46192 
5.2013-04-01 00:28:26  5  78 30164875  13.67 -3.80176 43.46192 
6.2013-04-01 00:12:52  6  78 30164875  13.67 -3.80176 43.46192 
6.2013-04-01 00:28:52  6  78 30164875  13.67 -3.80176 43.46192 

编辑保存/并再次读取它作为一个动物园对象,我sligthly绑定列表的rownames:

dd <- do.call(rbind,df2) 
rownames(dd) <- gsub('*.[.]','',rownames(dd)) 
write.table(dd,file='test.csv') 

现在我可以再次阅读:

read.zoo('test.csv',index=0,tz='') 
        nodeId battery idHistoric temperature longitude latitude 
2013-04-01 00:12:52  6  78 30164875  13.67 -3.80176 43.46192 
2013-04-01 00:13:07  4  78 30164278  13.67 -3.80176 43.46192 
2013-04-01 00:13:31  5  78 30163676  13.74 -3.80176 43.46192 
2013-04-01 00:13:59  3  78 30163676  13.74 -3.80176 43.46192 
2013-04-01 00:28:01  4  78 30163676  13.74 -3.80176 43.46192 
2013-04-01 00:28:26  5  78 30164875  13.67 -3.80176 43.46192 
2013-04-01 00:28:52  6  78 30164875  13.67 -3.80176 43.46192 
2013-04-01 00:28:54  3  78 30163676  13.74 -3.80176 43.46192 

EDIT2

由于@Gsee优秀的答案,你可以做到以下几点:

do.call(rbind, unname(df2)) 

这将保持该行的名称是正确的,因此不需要像我在之前的编辑中那样使用正则表达式。

+0

+1已经。我一直在试图弄清楚如何获得正确的行名。除了像你一样使用'gsub',最接近的是'data.table':'write.csv(rbindlist(lapply(df2,as.data.table,keep.rownames = TRUE)),row .names = TRUE)'。 – GSee

+1

啊。这个怎么样:'do.call(rbind,unname(df2))'? – GSee

+0

@太好了!把它作为答案! – agstudy

1

求解

xts返回一个向量。我必须迭代每个位置(使用while)并将每个元素写入一个csv文件。

df2 <- by(df,df$nodeId,function(x){ 
    ends <- endpoints(x, on = "minutes", k = 15) 
    xx <- period.apply(x, ends, mean) 
}) 

i <- 1 

total <- length(df2) 

while(i <= total){ 
    write.csv(df2[i],paste("lights_2013-04-0102/out_",i,".csv",sep = "")) 
    i <- i + 1 
} 
2

如果你看一下str(df2),你会看到,这是一个名为list。一般来说,当你有一个列表并且你想把它转换成一个单一的对象时,你可以使用像do.call(rbind, df2)这样的东西。这与rbind(df2[[1]], df2[[2]], df2[[3]], df2[[4]])相同,但可以使用任意长度的列表。

在这种情况下,您的listnames

> names(df2) 
[1] "3" "4" "5" "6" 

所以,如果你只是do.call(rbind, df2),该rownames不会很你想要的 - 他们会以列表的names预先考虑。

> rownames(do.call(rbind, df2)) 
[1] "3.2013-04-01 00:13:59" "3.2013-04-01 00:28:54" "4.2013-04-01 00:13:07" 
[4] "4.2013-04-01 00:28:01" "5.2013-04-01 00:13:31" "5.2013-04-01 00:28:26" 
[7] "6.2013-04-01 00:12:52" "6.2013-04-01 00:28:52" 

的解决方案是unname列表

do.call(rbind, unname(df2)) 

既然你有xts工作,你可能会想胁迫该到xts对象:

> as.xts(do.call(rbind, unname(df2))) 
        nodeId battery idHistoric temperature longitude latitude 
2013-04-01 00:12:52  6  78 30164875  13.67 -3.80176 43.46192 
2013-04-01 00:13:07  4  78 30164278  13.67 -3.80176 43.46192 
2013-04-01 00:13:31  5  78 30163676  13.74 -3.80176 43.46192 
2013-04-01 00:13:59  3  78 30163676  13.74 -3.80176 43.46192 
2013-04-01 00:28:01  4  78 30163676  13.74 -3.80176 43.46192 
2013-04-01 00:28:26  5  78 30164875  13.67 -3.80176 43.46192 
2013-04-01 00:28:52  6  78 30164875  13.67 -3.80176 43.46192 
2013-04-01 00:28:54  3  78 30163676  13.74 -3.80176 43.46192 

最后,我发现使用write.zoo可以方便地编写xtszoo对象的csv文件:

write.zoo(as.xts(do.call(rbind, unname(df2))), file="test.csv", sep=",")