Удаление строк в кадре данных, которые ссылаются на идентификаторы, которые не существуют в другом (R)? - PullRequest
0 голосов
/ 16 января 2019

У меня есть более концептуальный вопрос.Я ищу способ удаления всей строки из фрейма данных, если он содержит ссылку на данные, которых нет во втором фрейме данных.Приведенный ниже код даст вам набор данных для этой проблемы.

v1 <- c(1, 2, 3, 4, 5, 6, 8)
v2 <- 100
nodedf <- data.frame(v1, v2)
colnames(nodedf)  <- ("nid", "extra_variable") 

v3 <- c(1, 2)
v4 <- c(1, 5)
v5 <- c(2, 6)
v6 <- c(3, 7)
v7 <- c(4, 9)

elementdf <- data.frame(v3, v4, v5, v6, v7)
colnames(elementdf)  <- c("eid", "n1", "n2", "n3", "n4") 

По сути, я хочу удалить любую строку из elementdf, если она ссылается на идентификаторы узлов (n1, n2, n3, n4), которыене существует в nodedf.Я знаю, что это, вероятно, довольно простая проблема, но я действительно не так хорош в таких вещах.Спасибо.

РЕДАКТИРОВАТЬ: теперь я хочу сделать обратное, где я хочу удалить строки nodedf, которые ссылаются на узлы, которые не существуют в elementdf.

Сначала я попытался просто переставить старый фрагмент кода следующим образом:

orphannodesbye<- nodedf[apply(nodedf[,1], 1, function(x) all(x %in% elementdf[,2:5])),] 

Однако я получаю сообщение об ошибке:

Error in apply(nodedf[, 1], 1, function(x) all(x %in% elementdf[, 2:5])) : 
  dim(X) must have a positive length

Я бынапример, вывод будет целым df с обоими полями (или более, поскольку мой фактический набор данных имеет больше) nid и extra_variable.

1 Ответ

0 голосов
/ 16 января 2019

Вот базовое решение R

elementdf[apply(elementdf[,-1], 1, function(x) all(x %in% nodedf$nid)),]

Пояснение:

apply работает путем "применения" функции (в данном случае пользовательской) к каждой строке (переменная x в функции) объекта elementdf. Если бы мы хотели сделать это по столбцам, мы бы изменили 1 на 2.

Используемая нами функция просматривает каждый элемент в x (строка в elementdf) и проверяет, находится ли он также в nodedf. %in% - это специальная функция, которая возвращает вектор логики, элемент для каждого в x. Функция all возвращает TRUE, если все элементы TRUE (то есть все они в nodedf) и FALSE в противном случае.

Таким образом, в конце инструкция apply возвращает вектор логики, в зависимости от того, есть ли в каждой строке элементы, найденные в nodedf.


Чтобы получить значения в каждой строке, которых нет в nodedf, вы можете сделать

apply(elementdf[,-1], 1, function(x) x[!(x %in% nodedf$nid)])

, который вы заметите, уже очень похож на строку кода выше. За исключением этого случая, оператор apply вернет список. Из приведенного вами примера это будет список длиной 2, где первый элемент - numeric(0), а второй - вектор, содержащий 7. Если в одной строке несколько нарушителей, будет показан каждый из них.


Чтобы удалить строки в nodedf, которые не имеют ссылок в elementdf, вы можете сделать

nodedf[nodedf$nid %in% unique(unlist(elementdf[,-1])),]

Часть unique(unlist(...)) просто захватывает все уникальные значения в elementdf[,-1], преобразуя их в числовой вектор.

...