【问题标题】:Conditional subsetting from dataframe with multiple conditions来自具有多个条件的数据帧的条件子集
【发布时间】:2020-07-22 11:32:24
【问题描述】:

在下面的 data.frame 中,我想对所有包含 group == 0 和 2017、2018 和 2019 年的所有 3 年的行进行子集化。

所需输出在下面的示例中是第 4、5 和 6 行的信息。

我尝试了以下解决方案,但没有成功。 BASE R 中是否有快速修复?

dat <- data.frame(group = c(0,0,1, 0,0,0, 1, 1, 1), 
       year = rep(2017:2019, 3))

subset(dat, group == 0 & year == 2017 & year == 2018 & year == 2019)

【问题讨论】:

    标签: r dataframe subset


    【解决方案1】:

    如果 OP 想要处理“组”相邻的唯一性

    library(dplyr)
    library(data.table)
    dat %>%
       group_by(grp = rleid(group)) %>%
       filter(all(2017:2019 %in% year), group == 0) %>%
       ungroup %>%
       select(-grp)
    # A tibble: 3 x 2
    #  group  year
    #  <dbl> <int>
    #1     0  2017
    #2     0  2018
    #3     0  2019
    

    或者在base Rrle

    grp <- with(rle(dat$group), rep(seq_along(values), lengths))
    subset(dat, as.logical(ave(year,  grp, FUN = 
        function(x) all(2017:2019 %in% x)) ) & group == 0)
    #  group year
    #4     0 2017
    #5     0 2018
    #6     0 2019
    

    【讨论】:

    • @rnorouzian 我在想你想减少== 的次数
    • @rnorouzian 你需要subset(dat, as.logical(ave(year, grp, FUN = function(x) all(c(2017,2019) %in% x)) ) &amp; group == 0 &amp; year %in% c(2017, 2019))
    • @rnorouzian 或其他 optoiin 是首先执行 filterdat1 &lt;- subset(dat, year %in% c(2017, 2019)) 然后在解决方案中应用代码
    猜你喜欢
    • 2013-06-14
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 2021-08-01
    相关资源
    最近更新 更多