Использование нескольких логических критериев для поднабора в r - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть набор данных (загрузки из efa) с тремя переменными / факторами (ML1, ML2, ML3), и я хотел бы извлечь имена случаев, которые имеют абсолютное значение> = 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,])

Вторая попытка, казалось, полностью игнорировала & условие, даже если другие условия или условия работали.

Я также нашел это за помощь и не понимал, почему это не сработает в моем случае.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Вы можете использовать rowSums, чтобы найти строки, где точно одна переменная равна >= 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
1 голос
/ 11 февраля 2020

Используя метод 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

Это печатает список идентификаторов, которые соответствуют требованиям. Вы также можете оставить его как фрейм данных и получить больше информации, например, какой столбец ML был> = 0.3.

Редактировать: Забыл абсолютное значение. Кроме того, использование вашего метода будет работать, но вы должны использовать скобки вокруг каждого условия, такие как (cond1 &! Cond2 &! Cond3) | (! cond1 & cond2 &! cond3).

...