假设我有以下排序数据:
[1] 0.06997360 0.09154285 0.10607553 0.10607631 0.10652390 0.10857691
[7] 0.10858633 0.10858633 0.10870369 0.18790912 0.18792473 0.19509030
[13] 0.20040993 0.22548593 0.22550167 0.22593338 0.22893103 0.23196562
[19] 0.25901025 0.30231663 0.30245132 0.30246287 0.34893528 0.34938294
[25] 0.34943865 0.45200544 0.45658957 0.45673815 0.46432602 0.48493226
[31] 0.58318915 0.58618472 0.66311458 0.66311774 0.69777062 0.69782017
[37] 0.70456743 0.70754232 0.71668759 0.71744870 0.71780786 0.77227751
[43] 0.79785928 0.79823416 0.79831632 0.79832545 0.79863813 0.79880086
[49] 0.91610076 0.91611498 0.91611830 0.91612582 0.91612582 0.91614856
现在我想把它们分组,因为它们中的许多几乎是相同的。让我们说一个条件,如果两个值x [i]和x [i + 1]在一个组中是if(x [i + 1] -x [i] <0.01)那么第3个到达第9个值将在一个组中。这些值都应该用它们的平均值替换(例如)。我不知道如何做到这一点......有没有人知道如何提出这个问题,或者甚至是否存在这个问题的功能?
答案 0 :(得分:1)
以下是如何做到这一点。我按小组使用dplyr
到summarise
。首先,我使用滞后1来计算diff矢量。然后,我创建一个条件列,如果diff> 1,则为1。否则为0.01和0。然后,我使用cumsum
分组。 coalesce
用于在开始时处理NA。使用这些组,您现在可以summarise
。
x <- c(0.06997360, 0.09154285, 0.10607553, 0.10607631, 0.10652390, 0.10857691,
0.10858633,0.10858633,0.10870369,0.18790912,0.18792473,0.19509030,
0.20040993,0.22548593,0.22550167,0.22593338,0.22893103,0.23196562,
0.25901025,0.30231663,0.30245132,0.30246287,0.34893528,0.34938294,
0.34943865,0.45200544,0.45658957,0.45673815,0.46432602,0.48493226,
0.58318915,0.58618472,0.66311458,0.66311774,0.69777062,0.69782017,
0.70456743,0.70754232,0.71668759,0.71744870,0.71780786,0.77227751,
0.79785928,0.79823416,0.79831632,0.79832545,0.79863813,0.79880086,
0.91610076,0.91611498,0.91611830,0.91612582,0.91612582,0.91614856)
library(dplyr)
as.data.frame(x)%>%
mutate(diff=x-lag(x),
condition=(diff>0.01)*1,
group=cumsum(coalesce(condition, 0)))%>%
group_by(group)%>%
summarise(x_mean=mean(x))%>%
as.data.frame()
group x_mean
1 0 0.06997360
2 1 0.09154285
3 2 0.10758986
4 3 0.19283352
5 4 0.22756353
6 5 0.25901025
7 6 0.30241027
8 7 0.34925229
9 8 0.45741479
10 9 0.48493226
11 10 0.58468694
12 11 0.66311616
13 12 0.70852067
14 13 0.77227751
15 14 0.79836237
16 15 0.91612237
答案 1 :(得分:1)
在基础R中,您可以使用tapply
返回一个命名向量,并使用diff
和cumsum
构建分组机制
tapply(x, cumsum(c(0, diff(x) > 0.01)), mean)
返回
0 1 2 3 4 5 6
0.06997360 0.09154285 0.10758986 0.19283352 0.22756353 0.25901025 0.30241027
7 8 9 10 11 12 13
0.34925229 0.45741479 0.48493226 0.58468694 0.66311616 0.70852067 0.77227751
14 15
0.79836237 0.91612237
你可以将它放在像这样的data.frame中
data.frame(groupMeans = tapply(x, cumsum(c(0, diff(x) > 0.01)), mean))
正如Jaap在评论中提到的,返回data.frame的更直接的方法是在同一分组机制周围使用aggregate
。
aggregate(vec, list(cumsum(c(0, diff(vec) > 0.01))), mean)
这有一个很好的功能,即分组向量作为变量包含在data.frame中。
Ronak shah的sapply
与split
是一种更明确的方法,可以分割数据并计算数据。 tapply
在“引擎盖下”这样做。