【问题标题】:R: Keep the first and last two rows of the dataframe and meanwhile deleting one rows of other middle dataframeR:保留数据帧的第一行和最后两行,同时删除其他中间数据帧的一行
【发布时间】:2021-12-08 01:44:38
【问题描述】:

我对 R 中的数据清理有一个非常具体的问题,但我不确定我应该如何实现这一点。基本上,您可以在下面找到示例数据框。

test <- data.frame(personID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), 
                   sequenceTrip = c(1, 1, 2, 2, 3, 3, 4, 4), departureHour = c(9L, 
                                                                               9L, 13L, 13L, 14L, 14L, 16L, 16L), departureMinute = c(34L, 
                                                                                                                                      34L, 34L, 34L, 35L, 35L, 19L, 19L), tripRangeTypeOrigin = c(0, 
                                                                                                                                                                                                  0, 1, 1, 0, 0, 1, 1), arrivalHour = c(10, 10, 14, 14, 15, 
                                                                                                                                                                                                                                        15, 18, 18), arrivalMinute = c(34, 34, 34, 34, 49, 49, 4, 
                                                                                                                                                                                                                                                                       4), tripRangeTypeDestin = c(1, 1, 0, 0, 1, 1, 0, 0), tripPurpose = c("leisure", 
                                                                                                                                                                                                                                                                                                                                            "leisure", "return home", "return home", "shopping", "shopping", 
                                                                                                                                                                                                                                                                                                                                            "return home", "return home"), mode = c("car", "car", "car", 
                                                                                                                                                                                                                                                                                                                                                                                    "car", "car", "car", "car", "car"), tripDistance = c(77, 
                                                                                                                                                                                                                                                                                                                                                                                                                                         77, 77, 77, 100, 100, 115, 115), typicalDurationNextActivity = c(10800, 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          10800, 60, 60, 1800, 1800, 24960, 24960), arrivalTimeInMInute = c(NA, 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            NA, NA, NA, NA, NA, 1084, 1084), originDestinType = c(0, 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  1, 0, 1, 0, 1, 0, 1), tripNB = c("MUTSAARD", "Outside Brussels", 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   "Outside Brussels", "HEYSEL", "HEYSEL", "Outside Brussels", 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   "Outside Brussels", "CHAUSSEE DE WAVRE - SAINT-JULIEN "))

我想要实现的是保留此数据帧的第一、第二、倒数第二行(在本例中为第 7 行)和最后一行(在本例中为第 8 行),同时,对于行 3:6,我想过滤找出originDestinType == 1 的行。所以最终的数据框总共是 6 行。我知道这可以通过像rbind 这样的命令来实现,但是,我想知道是否有更简单的方法可以使用像dplyr 这样的包来实现这一目标?

非常感谢您的帮助!

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    澄清后更新:试试这个:

    library(dplyr)
    test %>% 
      groub_by(yourgroup) %>%
      filter(row_number() == first(row_number(),2) |
               row_number() == last(row_number(),2) |
                 originDestinType == 1)
    
    1. 列表项

    这是一个dplyr 解决方案: 我们可以将filter|&amp; 运算符以及firstlast 函数一起使用:

    library(dplyr)
    test %>% 
      filter(row_number() == first(row_number(),2) |
               row_number() == last(row_number(),2) |
               row_number() %in% (3:6) & originDestinType == 1)
    

    输出:

      originDestinType                            tripNB
    1                0                          MUTSAARD
    2                1                  Outside Brussels
    3                1                            HEYSEL
    4                1                  Outside Brussels
    5                0                  Outside Brussels
    6                1 CHAUSSEE DE WAVRE - SAINT-JULIEN 
    

    【讨论】:

    • 嗨 TarJae,问题是这是一个示例数据,在我的实际项目中,我们在不同的组中有未定义的行数。所以 'row_number() %in% (3:6)' 可能不适用于所有组。只是想知道您是否有更好的主意来替换它:) 谢谢
    • 这应该很简单:我们可以使用test %&gt;% group_by(xyz) %&gt;% filter(...
    • 嗨 TarJae,我知道 group_by 函数,我的意思是有些组将有 10 行,有些将有 12 行。但我仍然想保留第一行、第二行、倒数第二行和最后一行,同时过滤originDestinType == 1 的行。希望这有助于澄清:) 谢谢
    • 请看我的更新!
    • 嗨 Tarjae,我收到以下错误,您知道这是什么原因吗?或者我将生成另一个包含两组错误的示例代码:filter() 输入..1 出现问题。 i 输入..1|...。 x 下标越界 i 第 1 组发生错误:personID = 1
    【解决方案2】:

    这应该不错:

    df <- test %>% filter(rownames(test) %in% c(1,2,7,8) | originDestinType!=1)
    

    【讨论】:

    • 如果行数不同,您可以使用 nrow(test)-1nrow(test) 而不是 7 和 8
    • 这是真的,但我不知道他是否希望他的示例可以在更大的数据库上重现,还是仅在这个数据库上重现。因为它看起来真的很精确
    • 您好 Wietse,抱歉我缺乏解释。我确实想在一个更大的数据库中使用未定义的行数:)
    • 嗨 BPeif,我认为此代码与 group_by 函数结合使用时不起作用
    猜你喜欢
    • 2016-02-20
    • 2016-10-17
    • 2023-03-20
    • 2021-03-21
    • 2020-03-15
    • 2018-03-30
    • 2021-09-08
    • 2015-10-20
    • 1970-01-01
    相关资源
    最近更新 更多