代码之家  ›  专栏  ›  技术社区  ›  Wuff

用R中的“subset”函数查找补码

  •  2
  • Wuff  · 技术社区  · 6 年前

    我使用一个使用 base::subset 语法。 现在我不仅要求子集,还要求补。

    基::子集 : Take the complement of DF's subset

    在某种程度上可以找到 基::子集 .

    ## Example data frame
    df <- data.frame(
        a1 = 1:5,
        a2 = 2:6,
        b1 = c(NA, 1:4),
        b2 = rep(NA, 5)
    )
    
    ## Split part 1
    split1 <- subset(
        df,
        (a1 >= 3 | a2 >= 3) &
        (b1 >= 2 | b2 >= 3)
    )
    
    ## Split part 2
    split2 <- subset(
        df,
        (!(a1 >= 3) &
         !(a2 >= 3)) |
        (
            (!(b1 >= 2) |
             is.na(b1)) &
            (!(b2 >= 3) |
             is.na(b2))
        )
    )
    

    NA s、 ()

    因为我有时不得不重复它,所以创建一个函数可能更容易。但我不知道如何传递参数,例如 a1 >= 3

    2 回复  |  直到 6 年前
        1
  •  2
  •   Community gkalpak    4 年前

    保持 NA 条件 split2

    cond <- with(df, (a1 >= 3 | a2 >= 3) &  (b1 >= 2 | b2 >= 3))
    #[1] FALSE    NA  TRUE  TRUE  TRUE
    
    complement_cond <- !cond | is.na(cond)
    #[1]  TRUE  TRUE FALSE FALSE FALSE
    
    split1 <- subset(df, cond)
    split2 <- subset(df, complement_cond)
    

    不适用 条件 split1

    cond <- with(df, (a1 >= 3 | a2 >= 3) &  (b1 >= 2 | b2 >= 3))
    cond <- cond | is.na(cond)
    #[1] FALSE  TRUE  TRUE  TRUE  TRUE
    
    complement_cond <- !cond
    #[1]  TRUE FALSE FALSE FALSE FALSE
    
    split1 <- subset(df, cond)
    split2 <- subset(df, complement_cond)
    

    变化 Dan's answer

    保持 不适用 条件

    cond <- with(df, (a1 >= 3 | a2 >= 3) &  (b1 >= 2 | b2 >= 3))
    #[1] FALSE    NA  TRUE  TRUE  TRUE
    
    split1 <- subset(df, cond)
    split2 <- subset(df, !(row.names(df) %in% row.names(split1)))
    

    保持 条件 拆分1

    cond <- with(df, (a1 >= 3 | a2 >= 3) &  (b1 >= 2 | b2 >= 3))
    cond <- cond | is.na(cond)
    #[1] FALSE  TRUE  TRUE  TRUE  TRUE
    
    split1 <- subset(df, cond)
    split2 <- subset(df, !(row.names(df) %in% row.names(split1)))
    
        2
  •  2
  •   Daniel    6 年前

    df 使用 subset

    df$id <- 1:nrow(df)
    
    split1 <- subset(
    df,
     (a1 >= 3 | a2 >= 3) &
     (b1 >= 2 | b2 >= 3)
     )
    
    
    split2 <- subset(df, !df$id %in% split1$id)