【问题标题】:Remove rows by group if a condition meets in r如果在 r 中满足条件,则按组删除行
【发布时间】:2023-02-15 22:01:51
【问题描述】:

我有一个像这样的数据框去向:

df <- data.frame(year = c("2000", "2000", "2001", "2001", "2002", "2002", "2003", "2007", "2008"), 
                 id = c("A", "A", "A", "A", "A", "A", "A", "B", "B"), 
                 product = c("1", "2", "3", "4", "5", "6", "7", "8", "9"), 
                 market = c("CHN", "USA", "CHN", "CAN", "CHN", "ECU", "CHN", "ESP", "IRL"), 
                 FP = c(1, 1, 1, 1, 1, 1, 1, 1, 1),
                 FM = c(1, 1, 0, 1, 0, 1, 0, 1, 1),
                 first_success = c(0,0,0,0,2002,2002,2002,0, 0)
                 )

我想(通过 id)删除 first_success 年之后的观察结果(在变量中定义第一次成功并采用成功的年份的价值)。如果给定的 id(例如 B)没有成功,那么我想保留这些零。因此,在这种情况下,我只会删除第 7 行:

df_new <- data.frame(year = c("2000", "2000", "2001", "2001", "2002", "2002", "2007", "2008"), 
                 id = c("A", "A", "A", "A", "A", "A", "B", "B"), 
                 product = c("1", "2", "3", "4", "5", "6", "8", "9"), 
                 market = c("CHN", "USA", "CHN", "CAN", "CHN", "ECU", "ESP", "IRL"), 
                 FP = c(1, 1, 1, 1, 1, 1, 1, 1),
                 FM = c(1, 1, 0, 1, 0, 1, 1, 1),
                 first_success = c(0,0,0,0,2002,2002,0,0)
                 )

我尝试了以下方法:

df %>% 
 group_by(id) %>%
 subset(., first_succes!=0 & first_success<year)
 filter(if(any(first_success)!=0) year<=first_success else TRUE)

但是 filter 保留了表达式,而不是删除它(与 subset() 相同)。

任何想法?

【问题讨论】:

    标签: r if-statement dplyr tidyverse


    【解决方案1】:

    你可以这样做:

    library(dplyr) #1.1.0
    df %>% 
      filter(first_success == 0 | year <= first_success, .by = id)
    
      year id product market FP FM first_success
    1 2000  A       1    CHN  1  1             0
    2 2000  A       2    USA  1  1             0
    3 2001  A       3    CHN  1  0             0
    4 2001  A       4    CAN  1  1             0
    5 2002  A       5    CHN  1  0          2002
    6 2002  A       6    ECU  1  1          2002
    7 2007  B       8    ESP  1  1             0
    8 2008  B       9    IRL  1  1             0
    

    【讨论】:

      猜你喜欢
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多