2017-01-13 10 views
2

У меня есть ситуация, когда я хотел бы обнаружить условия между двумя логическими именованными векторами на основе комбинации TRUE/FALSE в каждой позиции в векторе. Например:Выбор логических векторных элементов на основе определенных условий

x <- c(TRUE, FALSE, FALSE, TRUE) 
names(x) <- c("a", "b", "c", "d") 
y <- c(TRUE, TRUE, FALSE, FALSE) 
names(y) <- names(x) 

Для каждого элемента в этих двух векторов я хочу, чтобы обнаружить 3 условия:

  • x[i] является TRUE и y[i] является TRUE;
  • x[i] является FALSE и y[i] является TRUE,
  • x[i] является TRUE и y[i] является FALSE.

Длина x и y такие же, но могут быть длиннее этого примера. Я хочу получить имя элемента для каждого условия и присвоить имя элемента новой переменной. Для этого примера:

v1 <- "a" 
v2 <- "b" 
v3 <- "d" 

В более длинной версии этих двух векторов я мог бы в конечном итоге с чем-то вроде:

v1 <- c("a", "e") 
v2 <- c("b", "f", "g") 
v3 <- c("d", "i", "k", "l") 

Что такое лучший Векторизованных способ сделать это. Я думаю, что это просто, но я не могу ответить на этот вопрос. Заранее спасибо.

ответ

3

Мы можем эффективно использовать split, но до этого нам нужен единый индекс группировки. Здесь есть возможность:

g <- x + y + x 
split(names(x), g) 

Чтобы понять выше индекс группировки, считают это:

x <- c(TRUE, TRUE, FALSE, FALSE) 
y <- c(TRUE, FALSE, TRUE, FALSE) 
x + y + x 
#[1] 3 2 1 0 

Таким образом, вы можете видеть, что 4 комбинации TRUE и FALSE отображаются 4 целочисленных значений.

Ах, так "а" получить назначен T-T, "Ъ" в T-F и т.д. Но, почему x + y + x ?? Я не следую за добавлением x дважды.

Если вы только сделать x + y, результат только 0, 1 и 2. Вы не сможете отличить T-F и F-T, как они оба 1.


@thelatemail предлагает более читаемым образом:

split(names(x), interaction(x, y, drop=TRUE)) 

Update

А ... глупо мне ... Почему я беспокоюсь о создании g.Я вдруг вспомнил, что мы можем передать список f аргумент в split:

split(names(x), list(x, y)) 

Примечание, внутренне в split.default:

if (is.list(f)) 
    f <- interaction(f, drop = drop, sep = sep) 
+1

Ах, так «а» получить назначен TT, «B» с ТФ и т. д. Но почему х + у + х? Я не следую за добавлением x дважды. Хорошо, я вижу. Это генерирует 4 различных целых числа для 4 ситуаций, используя логические целые числа. Умная!! – Ernie

+0

Еще один пример взаимодействия, который поможет с помощью 'split (names (x), взаимодействия (x, y, drop = TRUE))' - может сделать его более интерпретируемым, чем создание 'g' посредством добавления – thelatemail

+0

Очень приятно! Большое спасибо вам обоим! – Ernie

 Смежные вопросы

  • Нет связанных вопросов^_^