Создание списка краев с несколькими столбцами и N/As в R

Я работаю над igraph в R.

У меня есть фреймворк данных (df) с 29 столбцами — некоторые строки имеют значения, а некоторые — NAs.

Это выглядит примерно так:

      V1 V2 V3 V4
   1   1  2  3  NA
   2   2  3  NA NA
   3   2  4  1  NA
   4   1 NA  NA NA

но гораздо крупнее. У меня возникли проблемы с созданием списка краев из этих данных, и я пробовал:

myPairs <- apply(t(df), 2, function(x) t(combn(x[!is.na(x)], 2)))

но продолжайте получать эту ошибку:

Error in h(simpleError(msg, call)) : error in evaluating the argument 'x' in selecting a method for function 't': n < m

Вывод должен выглядеть так:

      col1   col2
   1  1      2
   2  1      3
   3  2      3
   4  2      3
   5  2      4
   6  2      1
   7  1      4

Любая помощь будет очень высоко ценится!

Каков ваш ожидаемый результат?

onyambu 22.04.2022 19:04

Чтобы усилить комментарий KU99, не очевидно, какими должны быть края. Как этот ввод должен быть преобразован в список краев?

G5W 22.04.2022 19:15

Я изменил свой исходный пост, чтобы ответить на ваши вопросы

LeahConfused 22.04.2022 21:33

Однако вы не объяснили интерпретацию ваших исходных данных и то, как они представляют собой набор связей. Я не вижу, как вывод вашего примера связан с вашим вводом.

Szabolcs 23.04.2022 00:16

Извинения. Числа в каждом ряду связаны. Итак, для ряда 1 соединены числа 1 и 2, соединены 2 и 3 и соединены 1 и 3.

LeahConfused 23.04.2022 10:53

Из желаемого вывода мы можем увидеть, какие строки связаны, но как определяете ли вы эти связи из представленного вами фрагмента данных? Связаны ли строки, если они содержат одни и те же значения? Дают ли значения переменных номера строк соединений? В этом случае мы могли видеть, что строка 1 связана со строками 1, 2 и 3.

DaveArmstrong 25.04.2022 14:19
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
6
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот один подход.

Убедитесь, что ваш data.frame является числовым:

df <- sapply(df, as.numeric)

Вы можете использовать apply с combn, как вы это делали, но сначала используйте na.omit, чтобы удалить пропущенные значения. Вы также можете проверить length, чтобы, если у вас есть только одно значение в строке, вы пропустили его.

do.call(rbind, apply(df, 1, function(x) {
  y <- na.omit(x)
  if (length(y) > 1)
    t(combn(y, 2))
}))

Выход

     [,1] [,2]
[1,]    1    2
[2,]    1    3
[3,]    2    3
[4,]    2    3
[5,]    2    4
[6,]    2    1
[7,]    4    1

Благодарю вас! это сработало отлично, я понял, что проблема с моим решением заключалась в строках только с одной переменной в них (которые, следовательно, не могли составить пару), но не смог собрать эффективное решение, кроме создания совершенно нового фрейма данных с эти строки удалены. Так что ваше решение отличное!

LeahConfused 25.04.2022 12:32

Другие вопросы по теме