Проверьте состояние фрейма данных для каждой строки, то есть строка за строкой - PullRequest
0 голосов
/ 18 мая 2018

У меня есть фрейм данных df со столбцами a1,b1,a2,b2,a3,b3.С другой стороны, у меня есть вектор vec.

, который я хочу получить для каждой строки df раз, когда элементы в столбцах b1,b2,b3 находятся в vec.

Я имею в виду, если в строке элементы столбцов b1 и b2 находятся в vec, а элемент столбца b3 не в vec Я хочу получить 2.Если ни один из элементов строки в столбцах b1,b2,b3 не находится в vec (также, если в них отсутствуют значения), я хочу получить 0.

Если я поставлю rowSums(!df[,c(b1,b2,b3)] %in% vec), яполучите ошибку 'x' must be an array of at least two dimensions, так как условие внутри - это одна строка, а не количество строк df.Другие попытки, которые я предпринял, также потерпели неудачу.

Одна из них: Пример только с 1 строкой:

df[1,c('b1','b2','b3')]: 6 -1 NA

Если я поставлю

df[1,c('b1','b2','b3')]==c(-1,-2),

Я получаю

FALSE FALSE NA

, где я хотел бы получить

FALSE TRUE NA

Заранее спасибо!

1 Ответ

0 голосов
/ 18 мая 2018

%in% работает на vector, поэтому мы перебираем интересующие столбцы и получаем поэлементную сумму с Reduce

Reduce("+", lapply(df[c('b1', 'b2', 'b3')], function(x) !x %in% vec))

Если мы проводим сравнение позатем мы можем использовать apply

rowSums(t(apply(df[c('b1', 'b2', 'b3')], 1, function(x) !x %in% vec)))

или преобразовать его в matrix, затем выполнить сравнение с %in%, изменить размеры и выполнить rowSums

m1 <- as.matrix(df[c('b1', 'b2', 'b3')])
rowSums(`dim<-`(!m1 %in% vec, dim(m1)))
...