筛选tidyverse中每组的前5个观察值

时间:2019-10-01 12:20:42

标签: r filter dplyr tidyverse

我有几个不同测量位置的降水数据,我想使用tidyverse函数仅对每个位置和每组降水强度的前n个观测值进行过滤。

到目前为止,我已经按位置和降水强度对数据进行了分组。

这是一个最小的示例(每个位置的每个降雨强度都有多个观测值)

df <- data.frame(location = c(rep(1, 7), rep(2, 7)),
                 rain = c(1:7, 1:7))

   location rain
1         1    1
2         1    2
3         1    3
4         1    4
5         1    5
6         1    6
7         1    7
8         2    1
9         2    2
10        2    3
11        2    4
12        2    5
13        2    6
14        2    7

我认为使用group_by()filter()应该很容易,但是到目前为止,我还没有找到一个表达式,该表达式只返回每个位置的每个降雨组的前n个观测值。

 df %>% group_by(rain, location) %>% filter(???)

3 个答案:

答案 0 :(得分:3)

您可以这样做:

df %>%
 group_by(location) %>%
 slice(1:5)

   location  rain
      <dbl> <int>
 1        1     1
 2        1     2
 3        1     3
 4        1     4
 5        1     5
 6        2     1
 7        2     2
 8        2     3
 9        2     4
10        2     5

答案 1 :(得分:2)

console.log(bakery('F 1 123395 F 2 488034 F 3 78861 F 4 200882 F 5 102517 F 6 49658 F 7 201804 F 8 247860 F 9 356333 F 10 163982 F 11 351283 F 12 305592 F 13 443860 F 14 111094 F 15 216152 F 17 220897 F 16 184823 F 19 438974 F 18 464208 B 1 61697 B 2 9577 B 2 244017 B 3 30849 B 3 39430 B 4 244017 B 4 19716 B 4 100441 B 5 19715 B 5 51258 B 6 100441 B 6 25630 B 6 24829 B 7 25629 B 7 100902 B 8 24829 B 8 123930 B 9 100902 B 9 61965 B 9 178166 B 10 61965 B 10 89084 B 10 81991 B 11 89083 B 11 175641 B 12 81991 B 12 152796 B 13 175642 B 13 76398 B 13 221930 B 14 76398 B 14 110965 B 14 55547 B 15 110965 B 15 27774 B 15 108076 B 17 73709 B 17 46206 B 17 110448 B 16 27773 B 16 92411 B 19 110449 B 19 116052 B 19 219487 B 18 46206 B 18 232104 B 21 219487 B 20 116052'))

非Dplyr解决方案(还会重新排列行)

    var fileA = new File("a.pdf");
    var fileB = new File("b.pdf");

    var mimeMultipartData = MimeMultipartData.newBuilder()
            .withCharset(StandardCharsets.UTF_8)
            .addFile("file1", fileA.toPath(), Files.probeContentType(fileA.toPath()))
            .addFile("file2", fileB.toPath(), Files.probeContentType(fileB.toPath()))
            .build();

    var request = HttpRequest.newBuilder()
            .header("Content-Type", mimeMultipartData.getContentType())
            .POST(mimeMultipartData.getBodyPublisher())
            .uri(URI.create("http://somehost/upload"))
            .build();

    var httpClient = HttpClient.newBuilder().build();
    var response = httpClient.send(request, BodyHandlers.ofString());

答案 2 :(得分:0)

data.table中的一个选项

library(data.table)
setDT(df)[, .SD[seq_len(.N) <=5], location]