【问题标题】:Removing Row Instances of a Data.Frame based on Column Value of Another Data.Frame根据另一个 Data.Frame 的列值删除 Data.Frame 的行实例
【发布时间】:2017-09-09 17:25:32
【问题描述】:

背景

我在 R 中有一个 NxM data.frame MATRIX_1,其中包含一系列值。除此之外,我还有另一个 NxM data.frame MATRIX_2 包含到第一个的 1:1 映射,但它们不是数值,而是布尔值,用于判断该数据点是否超出平均值的 2 个标准偏差那个特定的列。

目标

我想从我的MATRIX_1 中删除所有行,其中MATRIX_2 中对应的[row, col] 包含TRUE 值。

示例

MATRIX_2
AGE   SEX   BMI    BP    S1    S2    S3    S4    S5    S6     Y PROGRESSION
[1,] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE       FALSE

在上面,BMI 列中有一个 TRUE 值。因此,应该从MATRIX_1 中删除整行,其中MATRIX_1 如下所示:

MATRIX_1
    AGE SEX  BMI     BP  S1    S2   S3   S4     S5  S6   Y PROGRESSION
1    59   2 32.1 101.00 157  93.2 38.0 4.00 4.8598  87 151           1

尝试

我使用%in% 运算符看到了以下一些内容,但希望它自动应用于所有列,而df1[!(df1$name %in% df2$name),] 之类的内容专门针对框架中的单个列。

使用subset我几乎成功了

subset(diabetes2, boolean_diabetes2[,1] == TRUE)

【问题讨论】:

    标签: r


    【解决方案1】:

    要从MATRIX_1 中选择所有行,其中MATRIX_2 中的相应行包含所有FALSE 值,您可以这样做:

    # sample data    
    set.seed(1)
    MATRIX_2 <- matrix(sample(c(T,F), 3*4, T, prob = c(.3,.7)), ncol=3)
    MATRIX_1 <-  as.data.frame(matrix(runif(3*4), ncol=3))
    
    # subsetting
    MATRIX_1[!rowSums(MATRIX_2),]
    

    【讨论】:

    • 这很棒。您介意解释一下在这种情况下具体应用的是什么 rowSums 吗?
    • @RyanShocker 当然。 rowSums 在 MATRIX_2 中建立每行的总和。每个TRUE 值都计为1。因此,如果一行中有s any TRUE`值,则该行的结果将大于0。!rowSums(MATRIX_2)仅对那些没有TRUE值的行为TRUE(0相当于FALSE,使用 ! 运算符检查。)
    • 非常感谢!这正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    相关资源
    最近更新 更多