【问题标题】:How to Slice data frame rows and get maximum row in R? [duplicate]如何切片数据框行并在 R 中获得最大行? [复制]
【发布时间】:2017-06-20 06:52:36
【问题描述】:

从下面的数据框中,我需要获取唯一记录,特别是创建日期,其中列 p01、p02、p03 等于 100。因此,在生成的数据框中,我将获得 ids (3, 6,11,14,19,24,25,26,28 ...)

Id CREATION_DATE p01 p02 p31 combined_field 2 2016-06-01 18:38:20.081 100 0 NA p01_100 3 2016-06-01 19:25:54.733 100 0 NA p01_100 6 2016-06-02 02:10:01.696 0 100 不适用 p02_100 7 2016-06-02 02:36:05.958 100 0 NA p01_100 8 2016-06-02 02:36:35.263 100 0 NA p01_100 11 2016-06-02 16:14:48.259 100 0 NA p01_100 14 2016-06-02 21:30:46.163 0 100 不适用 p02_100 15 2016-06-02 22:45:30.451 100 0 NA p01_100 19 2016-06-04 04:19:51.653 100 0 NA p01_100 24 2016-06-06 00:04:39.383 0 100 不适用 p02_100 25 2016-06-06 09:02:14.595 100 0 NA p01_100 26 2016-06-06 09:43:00.552 0 100 不适用 p02_100 28 2016-06-07 09:06:43.859 0 100 不适用 p02_100 31 2016-06-07 21:16:00.166 100 0 不适用 p01_100 33 2016-06-08 10:47:14.24 100 0 NA p01_100 35 2016-06-09 09:40:26.429 100 0 NA p01_100 39 2016-06-09 23:08:28.582 0 100 不适用 p02_100 41 2016-06-13 05:31:34.209 0 100 不适用 p02_100 44 2016-06-13 21:38:16.356 100 0 NA p01_100 ...

我尝试将 p01、p02、p03 组合成组合字段,以便我可以对它们进行分组。

required.data <- within(required.data, { combined_field <- ifelse(p01 == 100, paste("p01_100"), ifelse(p02 == 100, paste("p02_100"), ifelse(lvs31 == 100, paste("p31_100"),""))) })

我无法考虑对数据框进行切片并在 p01、p02、p03 中的每一个中选择最新的创建日期,其中它具有最后 100 个(或在下一行变为 0 之前)。

预期输出:

Id CREATION_DATE p01 p02 p31 combined_field 3 2016-06-01 19:25:54.733 100 0 NA p01_100 6 2016-06-02 02:10:01.696 0 100 不适用 p02_100 11 2016-06-02 16:14:48.259 100 0 NA p01_100 14 2016-06-02 21:30:46.163 0 100 不适用 p02_100 19 2016-06-04 04:19:51.653 100 0 NA p01_100 24 2016-06-06 00:04:39.383 0 100 不适用 p02_100 25 2016-06-06 09:02:14.595 100 0 NA p01_100 28 2016-06-07 09:06:43.859 0 100 不适用 p02_100 ...

我试图在不计算 combine_field 的情况下获得所需的输出,但由于 R 是一种新语言,我无法理解它的语法,因此用尽了 Ideas。

【问题讨论】:

  • 能否请您输入dput 的数据和示例预期输出?
  • 根据描述的逻辑和你要提取的行,不清楚。
  • @jeremycg 我认为基于 OP 的 cmets,欺骗链接可能不是他/她寻求的答案
  • @jeremycg,这个问题不是重复的。我已经编辑了问题以提供更清晰的信息。你能删除重复的标签吗?

标签: r dataframe slice


【解决方案1】:

使用 dplyr

library(dplyr)
df %>% # Your data frame as in the post
  group_by(combined_field) %>%
  filter(CREATION_DATE == max(CREATION_DATE)) 
  # Assuming that your date-time variables belongs appropriate time class

【讨论】:

    【解决方案2】:

    我们可以使用slice

    library(dplyr)
    df %>%
       group_by(combined_field) %>%
       slice(which.max(CREATION_DATE))
    

    更新

    基于 OP 的 cmets,这可能有帮助

    library(data.table)
    setDT(df)[df[, .I[which.max(CREATION_DATE)],rleid(p01, p02)]$V1]
    #    Id       CREATION_DATE p01 p02 p31 combined_field
    #1:  3 2016-06-01 19:25:54 100   0  NA        p01_100
    #2:  6 2016-06-02 02:10:01   0 100  NA        p02_100
    #3: 11 2016-06-02 16:14:48 100   0  NA        p01_100
    #4: 14 2016-06-02 21:30:46   0 100  NA        p02_100
    #5: 19 2016-06-04 04:19:51 100   0  NA        p01_100
    #6: 24 2016-06-06 00:04:39   0 100  NA        p02_100
    #7: 25 2016-06-06 09:02:14 100   0  NA        p01_100
    #8: 28 2016-06-07 09:06:43   0 100  NA        p02_100
    #9: 35 2016-06-09 09:40:26 100   0  NA        p01_100
    #10:41 2016-06-13 05:31:34   0 100  NA        p02_100
    #11:44 2016-06-13 21:38:16 100   0  NA        p01_100
    

    【讨论】:

    • 这仅给出了 3 个变量的最大创建日期。但我试图在 100 个值更改为不同的变量(p01、p02、p31)之前获得最大创建日期,我觉得这很难实现。 combine_field 是一个计算值,但它并不是真正需要的,而是我试图解决问题的中间步骤。
    • @parishodak 看起来你的帖子被错误链接了。
    猜你喜欢
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多