【问题标题】:Remove row on group depending on multiple criteria r根据多个条件删除组上的行 r
【发布时间】:2021-02-24 11:47:05
【问题描述】:

我有一个在 Date 变量上有一些重复值的数据集,所以我想根据几个条件过滤这些行。例如,数据框如下所示:

df <- read.table(text = 
          "Date       column_A   column_B    column_C   Column_D
1        2020-01-01     10          15         15          20
2        2020-01-02     10          15         15          20
3        2020-01-03     10          13         15          20
4        2020-01-04     10          15         15          20
5        2020-01-05     NA          14         15          20
6        2020-01-05     7           NA         NA          28
7        2020-01-06     10          15         15          20
8        2020-01-07     10          15         15          20
9        2020-01-07     10          NA         NA          20
10       2020-01-08     10          15         15          20", header=TRUE)

df$Date <- as.Date(df$Date)

过滤的不同条件应该是,仅在重复行上:

  • 如果“A 列”为 NA 和其他数字,则选择数字行
  • 如果两个值相似(都是 NA 或都是数字),请选择 NA 较少的行。

经过几个选择后,我最好的方法是:

df$cnt_na <- apply(df[,2:5], 1, function(x) sum(is.na(x)))
df <- df %>%  group_by(Date) %>% slice(which.min(all_of(cnt_na))) %>% select(-cnt_na)

虽然在我的情况下,它不满足第一个条件。主要问题是,如果我按 !is.na(Date) 过滤,我还会删除其他不重复的行。

提前致谢

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我会根据您的条件对您的表格进行排序,然后为每个组选择第一行:

    library(dplyr)
    
    df %>% 
      rowwise() %>% 
      mutate(cnt_na = sum(across(-Date, ~ sum(is.na(.))))) %>% 
      arrange(Date, is.na(column_A), cnt_na) %>% 
      group_by(Date) %>% 
      slice_head() %>% 
      ungroup()
    

    给了

    # A tibble: 8 x 6
      Date       column_A column_B column_C Column_D cnt_na
      <date>        <int>    <int>    <int>    <int>  <int>
    1 2020-01-01       10       15       15       20      0
    2 2020-01-02       10       15       15       20      0
    3 2020-01-03       10       13       15       20      0
    4 2020-01-04       10       15       15       20      0
    5 2020-01-05        7       NA       NA       28      2
    6 2020-01-06       10       15       15       20      0
    7 2020-01-07       10       15       15       20      0
    8 2020-01-08       10       15       15       20      0
    

    【讨论】:

      猜你喜欢
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 2018-09-21
      相关资源
      最近更新 更多