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

private void parseExceptionContents(
      final Exception exception,
      final OutputStream out)
   {
      final StackTraceElement[] stackTrace = exception.getStackTrace();
      int index = 0;
      for (StackTraceElement element : stackTrace)
      {
         final String exceptionMsg =
              "Exception thrown from " + element.getMethodName()
            + " in class " + element.getClassName() + " [on line number "
            + element.getLineNumber() + " of file " + element.getFileName() + "]";
         try
         {
            out.write((headerLine + newLine).getBytes());
            out.write((headerTitlePortion + index++ + newLine).getBytes() );
            out.write((headerLine + newLine).getBytes());
            out.write((exceptionMsg + newLine + newLine).getBytes());
            out.write(
               ("Exception.toString: " + element.toString() + newLine).getBytes());
         }
         catch (IOException ioEx)
         {
            System.err.println(
                 "IOException encountered while trying to write "
               + "StackTraceElement data to provided OutputStream.\n"
               + ioEx.getMessage() );
         }
      }
   }
1
задан hmnoidk 18 January 2019 в 21:11
поделиться

1 ответ

Вот базовое решение 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] ], преобразуя их в числовой вектор.

0
ответ дан mickey 18 January 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: