2013-04-13 2 views
3

내가 사용하여 CSV 파일을로드 :저장 XTS 객체가

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

temp2.csv 파일의 처음 4 개 라인은 다음과 같습니다

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 

내가 노드 아이디로 그룹을 원하는 및 매 15 분마다 온도의 평균값을 구하십시오. 그래서 내가 입력 한 후

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) 
}) 

내 문제는 내가 csv 파일에 DF2를 쓸 수 있다는 것입니다. 나는 아직 그렇게 할 수 없었다. 나는 다음과 같은 구조 참조 화면에서 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에 저장할 수 있습니까? (주석에 @Roland에서 언급 한 바와 같이)

+2

'df2'는 "by"클래스 목록입니다. 리스트이기 때문에 do.call ("rbind", df2)'를 사용하여 data.frame으로 변환 할 수 있어야한다. 하지만 재현 할 수있는 예제가 없으면 나는 테스트 할 수 없습니다 ... – Roland

답변

3

당신은 당신의 데이터를 여기

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 
바로 할 그것을 읽으려면, 그럼 당신은 생성하고 그룹별로 목록을 저장

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') 

을 : 당신은 한 라이너 명령에, 당신의 XTS 개체를 만들 read.zoo을 사용할 수 있습니다

EDIT 동물원 개체로 저장하고 다시 읽으려면 바인드 된 목록의 rownames를 sligthly 변환합니다.

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

@GSee good! 답으로 써주세요! – agstudy

1

솔브레드

xts는 벡터를 반환합니다. 모든 위치를 반복하면서 (while을 사용하여) 모든 요소를 ​​CSV 파일에 작성해야했습니다. 당신이 str(df2) 보면

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

, 당신은 명명 된 list 것을 볼 수 있습니다. 일반적으로 목록이 있고이를 단일 객체로 변환하려는 경우 do.call(rbind, df2)과 같은 것을 사용할 수 있습니다. 이것은 rbind(df2[[1]], df2[[2]], df2[[3]], df2[[4]])과 동일하지만 길이에 관계없이 작동합니다.그들이리스트의 names 앞에 추가 할 수 있습니다 - 당신은 그냥 do.call(rbind, df2)rownames은 아주 당신이 원하는하지 않을 경우이 경우

, 당신의 list는, 그래서

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

names 있습니다.

> 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 
:

> 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에 당신이 xts 작업하고 있기 때문에

do.call(rbind, unname(df2)) 

, 당신은 아마 xts 객체에 그것을 강요 할거야 목록입니다

마지막으로, xts 또는 zoo 개체의 CSV 파일을 쓰기 위해 write.zoo을 사용하는 것이 편리하다는 것을 알았습니다.

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