3

次を使用して csv ファイルをロードしました。

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

nodeId でグループ化し、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)
 })

私の問題は、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に保存できますか?

4

3 に答える 3

3

これを行うことができます(コメントで@Rolandが述べたように)

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

これがあなたのデータを使った完全な例です。read.zoo1 つのライナー コマンドで 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

編集して保存/動物園オブジェクトとして再度読み取ります。バインドされたリストの行名を少し変換します。

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

これにより行名が正しく保持されるため、以前の編集で行ったように正規表現を使用する必要はありません。

于 2013-04-13T15:12:31.163 に答える
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の csv ファイルを書き込むために使用すると便利だと思います。xtszoo

write.zoo(as.xts(do.call(rbind, unname(df2))), file="test.csv", sep=",")
于 2013-04-13T16:03:06.417 に答える
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
}
于 2013-04-13T16:02:27.167 に答える