我有一个在 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
...
如果第二列中的数字在连续行中相等,我的目标是找到第三列中数字的中位数。即,如果它们同时出现,则取值的中值,并为相应的时隙替换该中值。
所以我的目标是输出:
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]])
这没有用。有人对此有任何答案吗?
还有比我上面做的更简单的方法吗?