1

次のように、各行が 1 つ以上のエンティティの時間内の発生として不規則なデータ フレームを持っています。

(time1) entitya entityf entityz
(time2) entityg entityh
(time3) entityo entityp entityk entityL
(time4) entityM

2 番目のベクトル (ノードリスト) で見つかったエンティティのサブセットから、ネットワーク分析用のエッジ リストを作成したいと考えています。私の問題は、私が知らないことです:

1)。ノードリスト内のエンティティのみをサブセット化する方法。検討していた

datanew<- subset(dataold, dataold %in% nodelist)

しかし、うまくいきません。

2)。不規則なデータ フレームを 2 列のエッジ リストにする方法。上記の例では、次のように変換されます。

entitya entityf
entitya entityz
entityz entityf
...

これを行う方法がわかりません。どんな助けでも本当に感謝しています!

4

1 に答える 1

1

これを試して:

# read your data 

dat <- strsplit(readLines(textConnection("(time1) entitya entityf entityz
(time2) entityg entityh
(time3) entityo entityp entityk entityL
(time4) entityM")), " ")

# remove (time)

dat <- lapply(dat, `[`, -1)

# filter

nodelist <- c("entitya", "entityf", "entityz", "entityg", "entityh",
              "entityo", "entityp", "entityk")

dat <- lapply(dat, intersect, nodelist)

# create an edge matrix

t(do.call(cbind, lapply(dat[sapply(dat, length) >= 2], combn, 2)))

この最後のステップは、理解するのが大変かもしれないので、ここにブレイクアウトがあります:

  • sapply(dat, length)リスト要素の長さを計算します
  • dat[... >= 2]少なくとも 2 つの項目を持つリスト要素のみを保持します
  • lapply(..., combn, 2)すべての組み合わせを作成します: 幅の広い行列のリスト
  • do.call(cbind, ...)すべての組み合わせを広い行列にバインドします
  • t(...)tall 行列に転置します
于 2012-12-09T12:51:56.737 に答える