【问题标题】:How to remove some row in each group and keep first of them?如何删除每组中的某些行并保留第一个?
【发布时间】:2019-09-04 18:46:15
【问题描述】:

假设我有

    family   person     loop.     mode      
     1      1          1        car
     1       1         1          walk
     1       1         1         car
     1       1         2         walk
     1       1         2          bus
     1       2         1          bus
     1       2         1          walk
     1       2         2          bus
     2       1         1           car
     2       1         1           car
     2       1         2          car
     2       2        1           bus

我想要这个:

每个人在每个家庭中都有一些循环。如果是汽车,我想为每个人和每个家庭保留每个循环的第一行,并删除该循环中的所有其他行(如果是汽车、公共汽车或步行)。如果循环的第一行不是汽车,我不会删除任何东西

输出:

    family   person     loop.     mode      
     1      1          1          car
     1       1         2          walk
     1       1         2          bus
     1       2         1          bus
     1       2         1          walk
     1       2         2          bus
     2       1         1          car
     2       1         2          car
     2       2        1           bus

在第一个家庭中,第一个人在第一个循环的第一行有汽车模式,所以我删除了他第一个循环中的所有行程,只保留了第一个。他的第二个循环没有汽车模式,所以我保留了所有。第二个人也没有汽车模式,所以我保留了所有。第二个家庭的第一个人在他的第一个循环中有模式车,所以我保留了第一排并删除了循环中的休息。他的第二个循环有一行,所以我保留了它,第二个人没有汽车模式,所以我保留了它

【问题讨论】:

  • 很高兴说出你投反对票的原因
  • 感谢您的快速回答,成功了

标签: r dataframe


【解决方案1】:

一个选项是按'family'、'person'、'loop.'和slice分组,只有第一行if'mode'的first元素是'car',否则返回完整的行数

library(dplyr)
df1 %>%
    group_by(family, person, loop.) %>%
    slice(if(first(mode) == 'car') 1 else row_number())
# A tibble: 9 x 4
# Groups:   family, person, loop. [7]
#  family person loop. mode 
#   <int>  <int> <int> <chr>
#1      1      1     1 car  
#2      1      1     2 walk 
#3      1      1     2 bus  
#4      1      2     1 bus  
#5      1      2     1 walk 
#6      1      2     2 bus  
#7      2      1     1 car  
#8      2      1     2 car  
#9      2      2     1 bus  

数据

df1 <- structure(list(family = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L), person = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 
1L, 2L), loop. = c(1L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 
1L), mode = c("car", "walk", "car", "walk", "bus", "bus", "walk", 
"bus", "car", "car", "car", "bus")), class = "data.frame", row.names = c(NA, 
-12L))

【讨论】:

    猜你喜欢
    • 2019-04-28
    • 2011-08-31
    • 1970-01-01
    • 2016-10-28
    • 2021-12-21
    • 2017-06-08
    • 1970-01-01
    • 2019-06-10
    • 2019-06-21
    相关资源
    最近更新 更多