R:特定值行的中值

时间:2016-12-05 13:07:27

标签: r

我需要根据另一列(SEQ)获得行的中值。让我根据样本数据解释你:

data <- structure(list(DATUM = structure(c(1335558400, 1335558400, 1335558400, 
                                           1335558400, 1335562429, 1335562429, 1335562429, 1335562429, 1335562429, 
                                           1335562429, 1335562429, 1335562429, 1335562429, 1335562429, 1335562429, 
                                           1335567274, 1335567274, 1335567274, 1335567274, 1335567274, 1335567274, 
                                           1335567274, 1335567274, 1335567274, 1335567274, 1335567274, 1335681543, 
                                           1335681543, 1335681543, 1335681543), class = c("POSIXct", "POSIXt"
                                           )), CHGNR = c(200028, 200028, 200028, 200028, 200029, 200029, 
                                                         200029, 200029, 200029, 200029, 200029, 200029, 200029, 200029, 
                                                         200029, 200029, 200029, 200029, 200029, 200029, 200029, 200029, 
                                                         200029, 200029, 200029, 200029, 200057, 200057, 200057, 200057
                                           ), SEQ = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
                                                      2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 2L, 2L, 
                                                      2L
                                          ), PROBE = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 
                                                       2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 1, 2, 2, 
                                                     2
                                          ), METHODE = c("a", "a", "b", "b", "a", "a", "a", "a", "a", "b", "b", "b", "b", "a", "a",
                                                         "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "a", "a", "a", "b", "b"
                                          ),MITTELWERT = c(2.5,1.67, 0, 0, 0.5, 0.333333333333333, 0.5, 0, 0, 0, 0, 
                                                             0, 5, 0, 0.833333333333333, 0, 0, 0, 0, 0, 0.5, 1, 0, 0, 
                                                             0, 0.5, 0.666666666666667,1, 0, 0)
                       ), .Names = c("DATUM", "CHGNR", "SEQ","PROBE","METHODE", "MITTELWERT"), 
                  row.names = c(NA,30L), class = "data.frame")

所以数据看起来像那样:

                 DATUM  CHGNR SEQ PROBE METHODE MITTELWERT
1  2012-04-27 22:26:40 200028   1     1       a  2.5000000
2  2012-04-27 22:26:40 200028   1     1       a  1.6700000
3  2012-04-27 22:26:40 200028   1     1       b  0.0000000
4  2012-04-27 22:26:40 200028   1     1       b  0.0000000
5  2012-04-27 23:33:49 200029   1     1       a  0.5000000
6  2012-04-27 23:33:49 200029   1     1       a  0.3333333
7  2012-04-27 23:33:49 200029   2     2       a  0.5000000
8  2012-04-27 23:33:49 200029   2     2       a  0.0000000
9  2012-04-27 23:33:49 200029   2     2       a  0.0000000
10 2012-04-27 23:33:49 200029   2     2       b  0.0000000
11 2012-04-27 23:33:49 200029   2     2       b  0.0000000
12 2012-04-27 23:33:49 200029   2     2       b  0.0000000
13 2012-04-27 23:33:49 200029   2     2       b  5.0000000
14 2012-04-27 23:33:49 200029   2     2       a  0.0000000
15 2012-04-27 23:33:49 200029   2     2       a  0.8333333
16 2012-04-28 00:54:34 200029   3     2       a  0.0000000
17 2012-04-28 00:54:34 200029   3     2       a  0.0000000
18 2012-04-28 00:54:34 200029   3     2       a  0.0000000
19 2012-04-28 00:54:34 200029   3     2       a  0.0000000
20 2012-04-28 00:54:34 200029   3     2       b  0.0000000
21 2012-04-28 00:54:34 200029   3     3       b  0.5000000
22 2012-04-28 00:54:34 200029   3     3       b  1.0000000
23 2012-04-28 00:54:34 200029   3     3       b  0.0000000
24 2012-04-28 00:54:34 200029   3     3       b  0.0000000
25 2012-04-28 00:54:34 200029   3     3       b  0.0000000
26 2012-04-28 00:54:34 200029   3     3       a  0.5000000
27 2012-04-29 08:39:03 200057   1     1       a  0.6666667
28 2012-04-29 08:39:03 200057   2     2       a  1.0000000
29 2012-04-29 08:39:03 200057   2     2       b  0.0000000
30 2012-04-29 08:39:03 200057   2     2       b  0.0000000

我希望为每个唯一MITTELWERTCHGNR获得一个新行,其中间列为METHODE,仅适用于 SEQ&gt; 1 (+列DATUMPROBE的第一个值)。因此,在此示例数据中,它看起来像:

                 DATUM  CHGNR SEQ PROBE METHODE MITTELWERT
1  2012-04-27 22:26:40 200028   1     1       a  2.5000000
2  2012-04-27 22:26:40 200028   1     1       a  1.6700000
3  2012-04-27 22:26:40 200028   1     1       b  0.0000000
4  2012-04-27 22:26:40 200028   1     1       b  0.0000000
5  2012-04-27 23:33:49 200029   1     1       a  0.5000000
6  2012-04-27 23:33:49 200029   1     1       a  0.3333333
7  2012-04-27 23:33:49 200029   2     2       a  0.5000000
8  2012-04-27 23:33:49 200029   2     2       a  0.0000000
9  2012-04-27 23:33:49 200029   2     2       a  0.0000000
10 2012-04-27 23:33:49 200029   2     2       b  0.0000000
11 2012-04-27 23:33:49 200029   2     2       b  0.0000000
12 2012-04-27 23:33:49 200029   2     2       b  0.0000000
13 2012-04-27 23:33:49 200029   2     2       b  5.0000000
14 2012-04-27 23:33:49 200029   2     2       a  0.0000000
15 2012-04-27 23:33:49 200029   2     2       a  0.8333333
16 2012-04-28 00:54:34 200029   3     2       a  0.0000000
17 2012-04-28 00:54:34 200029   3     2       a  0.0000000
18 2012-04-28 00:54:34 200029   3     2       a  0.0000000
19 2012-04-28 00:54:34 200029   3     2       a  0.0000000
20 2012-04-28 00:54:34 200029   3     2       b  0.0000000
21 2012-04-28 00:54:34 200029   3     3       b  0.5000000
22 2012-04-28 00:54:34 200029   3     3       b  1.0000000
23 2012-04-28 00:54:34 200029   3     3       b  0.0000000
24 2012-04-28 00:54:34 200029   3     3       b  0.0000000
25 2012-04-28 00:54:34 200029   3     3       b  0.0000000
26 2012-04-28 00:54:34 200029   3     3       a  0.5000000
27 2012-04-27 23:33:49 200029   >1    2       a  0.0000000 #new calculated row with median value for unique CHGNR and METHODE "a"
28 2012-04-27 23:33:49 200029   >1    2       b  0.0000000 #new calculated row with median value for unique CHGNR and METHODE "b"
...

感谢您的任何提示!

1 个答案:

答案 0 :(得分:2)

您可以使用dplyr

library(dplyr)
out <- data %>% group_by(CHGNR,METHODE) %>% 
                summarise(DATUM=DATUM[1],PROBE=PROBE[1],MITTELWERT=median(MITTELWERT[SEQ>1]),SEQ=">1") %>%
                ungroup %>% filter(!is.na(MITTELWERT)) %>% 
                select(DATUM,CHGNR,SEQ,PROBE,METHODE,MITTELWERT) #%>%

我们group_by CHGNRMETHODE将行分为每个CHGNRMETHODE的组。然后使用summarise median计算中位数MITTELWERT。请注意,MITTELWERTSEQ>1的子集。在summarise中,我们还总结了DATUMPROBE及其第一个元素,并将SEQ设置为">1"。最后,我们ungroup使用NA删除这些行,并对列重新排序以匹配原始data

要将结果作为附加行添加到data,我们需要将SEQ列更改为character。然后,我们可以使用bind_rows

data$SEQ <- as.character(data$SEQ)
out <- bind_rows(data,out)
                 DATUM  CHGNR SEQ PROBE METHODE MITTELWERT
1  2012-04-27 16:26:40 200028   1     1       a  2.5000000
2  2012-04-27 16:26:40 200028   1     1       a  1.6700000
3  2012-04-27 16:26:40 200028   1     1       b  0.0000000
4  2012-04-27 16:26:40 200028   1     1       b  0.0000000
5  2012-04-27 17:33:49 200029   1     1       a  0.5000000
6  2012-04-27 17:33:49 200029   1     1       a  0.3333333
7  2012-04-27 17:33:49 200029   2     2       a  0.5000000
8  2012-04-27 17:33:49 200029   2     2       a  0.0000000
9  2012-04-27 17:33:49 200029   2     2       a  0.0000000
10 2012-04-27 17:33:49 200029   2     2       b  0.0000000
11 2012-04-27 17:33:49 200029   2     2       b  0.0000000
12 2012-04-27 17:33:49 200029   2     2       b  0.0000000
13 2012-04-27 17:33:49 200029   2     2       b  5.0000000
14 2012-04-27 17:33:49 200029   2     2       a  0.0000000
15 2012-04-27 17:33:49 200029   2     2       a  0.8333333
16 2012-04-27 18:54:34 200029   3     2       a  0.0000000
17 2012-04-27 18:54:34 200029   3     2       a  0.0000000
18 2012-04-27 18:54:34 200029   3     2       a  0.0000000
19 2012-04-27 18:54:34 200029   3     2       a  0.0000000
20 2012-04-27 18:54:34 200029   3     2       b  0.0000000
21 2012-04-27 18:54:34 200029   3     3       b  0.5000000
22 2012-04-27 18:54:34 200029   3     3       b  1.0000000
23 2012-04-27 18:54:34 200029   3     3       b  0.0000000
24 2012-04-27 18:54:34 200029   3     3       b  0.0000000
25 2012-04-27 18:54:34 200029   3     3       b  0.0000000
26 2012-04-27 18:54:34 200029   3     3       a  0.5000000
27 2012-04-29 02:39:03 200057   1     1       a  0.6666667
28 2012-04-29 02:39:03 200057   2     2       a  1.0000000
29 2012-04-29 02:39:03 200057   2     2       b  0.0000000
30 2012-04-29 02:39:03 200057   2     2       b  0.0000000
31 2012-04-27 17:33:49 200029  >1     1       a  0.0000000
32 2012-04-27 17:33:49 200029  >1     2       b  0.0000000
33 2012-04-29 02:39:03 200057  >1     1       a  1.0000000
34 2012-04-29 02:39:03 200057  >1     2       b  0.0000000