【问题标题】:Using multiple logical criteria for subsetting in r在 r 中使用多个逻辑标准进行子集化
【发布时间】:2020-02-11 16:38:30
【问题描述】:

我有一个包含三个变量/因素(ML1、ML2、ML3)的数据集(从 efa 加载),我想提取绝对值 >= 0.3 的案例名称,正好是一个 变量/因素。

这是我到目前为止的工作:

items <- row.names(loadings1[(abs(loadings1$ML1) >= 0.3 | abs(loadings1$ML2) >= 0.3 | abs(loadings1$ML3) >= 0.3) & sum(abs(loadings1$ML1) >= 0.3 , abs(loadings1$ML2) >= 0.3 , abs(loadings1$ML3) >= 0.3 ) == 1,])

它只返回一个空字符,我知道这不是因为没有符合我条件的案例。

我也试过了:

row.names(loadings1[abs(loadings1$ML1) >= 0.3 | abs(loadings1$ML2) >= 0.3 | abs(loadings1$ML3) >= 0.3 & sum(abs(loadings1$ML1) >= 0.3 , abs(loadings1$ML2) >= 0.3 , abs(loadings1$ML3) >= 0.3 ) == 1,])

即使不同的 or 条件有效,第二次尝试似乎也完全忽略了 & 条件。

我还找到了this 寻求帮助,但我真的不明白为什么它在我的情况下不起作用。

有什么想法吗?

【问题讨论】:

    标签: r subset logical-operators


    【解决方案1】:

    您可以使用rowSums 查找恰好一个变量&gt;= 0.3 的行。

    items <- row.names(loadings1)[rowSums(abs(loadings1[c("ML1","ML2","ML3")]) >= 0.3) == 1]
    items
    #[1] "6" "7"
    

    数据:

    set.seed(1)
    (loadings1 <- data.frame(id = 1:10, ML1 = rnorm(10), ML2 = rnorm(10), ML3 = rnorm(10)))
    #   id        ML1         ML2         ML3
    #1   1 -0.6264538  1.51178117  0.91897737
    #2   2  0.1836433  0.38984324  0.78213630
    #3   3 -0.8356286 -0.62124058  0.07456498
    #4   4  1.5952808 -2.21469989 -1.98935170
    #5   5  0.3295078  1.12493092  0.61982575
    #6   6 -0.8204684 -0.04493361 -0.05612874
    #7   7  0.4874291 -0.01619026 -0.15579551
    #8   8  0.7383247  0.94383621 -1.47075238
    #9   9  0.5757814  0.82122120 -0.47815006
    #10 10 -0.3053884  0.59390132  0.41794156
    

    【讨论】:

    • 谢谢!这正是我所希望的优雅解决方案!
    【解决方案2】:

    使用dplyr 方法,您可以这样做。 case_when 在应用多个条件时很有用。

    set.seed(1)
    df <- tibble(id = 1:10, ML1 = rnorm(10), ML2 = rnorm(10), ML3 = rnorm(10))
    df %>% 
      mutate(
        Which = case_when(
          abs(ML1) >= 0.3 & abs(ML2) < 0.3 & abs(ML3) < 0.3 ~ "ML1",
          abs(ML2) >= 0.3 & abs(ML1) < 0.3 & abs(ML3) < 0.3 ~ "ML2",
          abs(ML3) >= 0.3 & abs(ML1) < 0.3 & abs(ML2) < 0.3 ~ "ML3",
        )
      ) %>%
      filter(!is.na(Which)) %>%
      select(id) %>%
      unlist
    
    

    这会打印出符合条件的 id 列表。您还可以将其保留为数据框并获取更多信息,例如哪个 ML 列 >= 0.3。

    编辑:忘记绝对值。此外,使用您的方法也可以,但您必须在每个条件周围使用括号,例如 (cond1 & !cond2 & !cond3) | (!cond1 & cond2 & !cond3)。

    【讨论】:

      猜你喜欢
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      相关资源
      最近更新 更多