2016-06-01 3 views
0

В следующем примере:Сравнивая векторы нескольких значений столбцов в R data.table

DT <- data.table(A1=c(1,2),A2=c(2,3),B1=c(1,2),B2=c(3,4),B3=c(2,5)) 

Я хочу проверить для каждой строки, является ли значение в столбце А1 и А2, как происходит в любом В1, В2 или В3 ,

Если я:

DT[,BOTH_PRESENT:=!(F %in% (c(A1,A2) %in% c(B1,B2,B3)))] 

Это дает:

A1 A2 B1 B2 B3 BOTH_PRESENT 
1: 1 2 1 3 2   TRUE 
2: 2 3 2 4 5   TRUE 

Хотя я бы ожидать, правда на 1-й строки и Ложные для 2-го ряда.

# Row 1 
!(F %in% (c(1,2) %in% c(1,3,2))) 
# Row 2 
!(F %in% (c(2,3) %in% c(2,4,5))) 

Как мне изменить код?

Поскольку мой реальный набор данных намного больше с точки зрения столбцов, выражение, подобное (A1 == B1 | A1 == B2 | A1 == B3) & (A2 == B1 | A2 == B2 | A2 == B3), не будет хорошим решением.

+0

Почему downvote? Пожалуйста, предоставьте отзыв, если вы это сделаете. –

+3

Я думаю, что решение в конце концов на самом деле довольно эффективно. Вам нужно только создать выражение программно, если у вас много столбцов. – Roland

+0

Хорошо, попробуй, спасибо –

ответ

2

Мы можем группу последовательности строк data.table, unlist на «A», колонн, проверить, является ли all этих элементов %in%unlist ред колонны «B».

DT[, BOTH_PRESENT := all(unlist(.SD[, 1:2, with = FALSE]) %in% 
     unlist(.SD[, 3:5, with = FALSE])), by = 1:nrow(DT)] 

Или, как @Roland упоминалось,

DT[,BOTH_PRESENT:= all(c(A1, A2) %in% c(B1,B2,B3)), by = seq_len(nrow(DT))] 
+3

Или 'DT [, BOTH_PRESENT: = all (c (A1, A2)% in% c (B1, B2, B3)), by = seq_len (nrow (DT))] '. Обратите внимание, что это цикл, повторяющийся по строкам, который может быть медленным. – Roland

+0

Спасибо, попробуй, на самом деле нужно выполнить эту проверку при группировке на A1 и A2, чтобы вычислить суммарную меру, но я думаю, что могу переписать код, чтобы сделать именно это. –

+0

Awesome! Спасибо, ребята, работает как шарм. Я предпочитаю решение @Roland в комментарии (более читаемое). –

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