3

Rで次のようなデータフレームがあります:

Date | Time | value  
A  | 1  | 3       
A  | 1  | 6     
A  | 2  | 4  
A  | 3  | 3  
A  | 4  | 2  
A  | 5  | 7  
B  | 1  | 6       
B  | 2  | 5  
B  | 2  | 3  
B  | 2  | 4  
B  | 3  | 2  
B  | 5  | 3  
B  | 6  | 4  
... 

私の目的は、2 列目の数値が連続する行で等しい場合、3 列目の数値の中央値を見つけることです。つまり、値が同時に発生する場合は値の中央値を取得し、その中央値を対応するタイムスロットに置き換えます。

だから私が目指している出力:

A  | 1  | median (3,6)       
A  | 2  | 4  
A  | 3  | 3  
A  | 4  | 2  
A  | 5  | 7  
B  | 1  | 6       
B  | 2  | median (3,4,5)   
B  | 3  | 2  
B  | 5  | 3  
B  | 6  | 4  
... 

データセットが巨大であるため、ループを回避しようと必死です。私が抱えている主な問題は、値を個別に収集することです。これは私がこれまで持っていたものです:

#First find consecutive time slots that are equal:
timeslots_equal<-which(diff(data_RAW$TIME)==0)

coordinates_placesholder <- sort(c(as.vector(timestamp_equal_coordinates), as.vector(timestamp_equal_coordinates)+1))

coordinates_placesholder2  <-  coordinates_placesholder[-c(which(diff(coordinates_placesholder)==0), which(diff(coordinates_placesholder)==0) +1)]

 #The following matrix are the coordinates in the value vector with equal time slots
 matrix_ranges<-t(matrix(coordinates_placesholder2,2))

matrix_ranges上記の例では、次のようになります。

1 | 2  
8 | 10  

次に、次のようなものを適用しようとしました

median(data_RAW$Value[matrix_ranges[,1]:matrix_ranges[,2]])

これはうまくいきませんでした。これを行うことについて誰か答えがありますか?

また、上記よりも簡単にこれを行う方法はありますか?

4

1 に答える 1

3

二つの解釈が思い浮かびます。

解釈 1: 重要なのは、連続した繰り返しではなく、「日付」と「時間」の組み合わせです。この場合、aggregate(または「data.table」などのお気に入りの集計関数またはパッケージ)を使用してください。

aggregate(value ~ Date + Time, mydf, median)
#    Date Time value
# 1     A    1   4.5
# 2     B    1   6.0
# 3     A    2   4.0
# 4     B    2   4.0
# 5     A    3   3.0
# 6     B    3   2.0
# 7     A    4   2.0
# 8     A    5   7.0
# 9     B    5   3.0
# 10    B    6   4.0

解釈 2: 連続した繰り返し重要です。この場合、別の「グループ化」変数が必要です。これには、 を使用できますrle。その後の集計手順はほとんど同じです。

RLE <- rle(DF$Time)$lengths
RLE <- rep(seq_along(RLE), RLE)
aggregate(value ~ Date + Time + RLE, DF, median)
#    Date Time RLE value
# 1     A    1   1   4.5
# 2     A    2   2   4.0
# 3     A    3   3   3.0
# 4     A    4   4   2.0
# 5     A    5   5   7.0
# 6     B    1   6   6.0
# 7     B    2   7   4.0
# 8     B    3   8   2.0
# 9     B    5   9   3.0
# 10    B    6  10   4.0
# 11    A    1  11   3.0
# 12    B    3  12   2.0

他の人のために、再現可能なデータmydfをいくつか示しますDF。(数行が繰り返されているDFだけです。)mydf

mydf <- structure(list(Date = c("A", "A", "A", "A", "A", "A", "B", "B", 
        "B", "B", "B", "B", "B"), Time = c(1L, 1L, 2L, 3L, 4L, 5L, 1L, 
        2L, 2L, 2L, 3L, 5L, 6L), value = c(3L, 6L, 4L, 3L, 2L, 7L, 6L, 
        5L, 3L, 4L, 2L, 3L, 4L)), .Names = c("Date", "Time", "value"), 
        class = "data.frame", row.names = c(NA, -13L))
DF <- rbind(mydf, mydf[c(1, 1, 11, 11), ])
于 2013-10-10T18:43:08.150 に答える