在 R 中创建具有多列和 N/As 的边缘列表

Creating an edgelist with multiple columns and N/As in R

我正在用 R 开发 igraph。

我有一个包含 29 列的数据框 (df) - 有些行都有值,有些行有 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

非常感谢任何帮助!

这是一种方法。

确保您的 data.frame 是数字:

df <- sapply(df, as.numeric)

您可以像之前那样将 applycombn 一起使用,但首先使用 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