我的朋友和我一直绞尽脑汁想知道如何从以下示例数据集中找到中位数:
A <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) #15 minute intervals
B <- c(4.1, 3.3, 11.7, 3.9, 2.9, 3.6, 4.8, 3.5, 5.0, 4.4, 4.9, 9.9, 8.5, 11.0, 14.0) #Blood glucose mmolperL
C <- c(NA, NA, 130, NA, NA, NA, NA, 115, NA, NA, NA, 120, NA, NA, NA) #Systolic Blood pressure
DF <- cbind(A,B,C)
从上述数据集中我们希望知道在收缩期(C列)的时间周围的中值血糖值(B列) . 问题在于与收缩压(130)的读数在同一行中的第一次血糖读数(11.7)与该时间点附近的其他读数完全不同 .
我们希望将这个11.7值附近的血糖数据点计算出来并计算中位数并将其分配给相应的血压 .
!!注意!!这是一个实验的一个示例数据集 . 在其他实验中,时间间隔不是很整齐,因此我们不能使用基于A列的常规子集标准 . 真正的数据帧也很多,更大,血压之间的行数更多读数 . 我简化了这个例子的数据框架 .
2 回答
虽然@Jaap为原始问题提供了很好的解决方案 . 我还在试图找到一种不使用
aggregate
的方法 .我想考虑
previous
,next
和B
的当前读数(C
包含有效值)来计算median
.可能的解决方案:
这使:
这是做什么的:
w <- which(!is.na(DF$C))
创建索引w
,其中C
不是NA .使用
aggregate
,您可以计算所需行的median
. 在这种情况下,我选择仅采用行本身以及C
具有值的行之前和之后的行 .DF[rep(w, each = 3) + c(-1,0,1),]
过滤DF
只到所需的行rep(1:length(w), each = 3)
为aggregate
创建分组矢量结果将分配回
B
中的rownumbers的B
列 .您也可以将此逻辑与
data.table
-package一起使用:因为实际数据要大得多(如问题中所述),所以在更大的数据集上测试不同的解决方案是值得的 .
首先,让我们创建一个大型数据集,模仿问题中的原始
DF
:基础R解决方案的时间安排:
dplyr
解决方案的时间安排:data.table
解决方案的时间安排:从测试结果中可以清楚地看出:
data.table
-solution是最快的,其次是基本的R解决方案,而dplyr
-solution是迄今为止最慢的 .使用数据: