1

我有一个参差不齐的数据框,每一行作为一个或多个实体的时间出现,如下所示:

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

我想从第二个向量(节点列表)中找到的实体子集创建用于网络分析的边缘列表。我的问题是我不知道:

1)。如何仅对节点列表中的实体进行子集化。我在考虑

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

但它不起作用。

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]仅保留至少包含两项的列表元素
  • lapply(..., combn, 2)创建所有组合:宽矩阵列表
  • do.call(cbind, ...)将所有组合绑定到一个宽矩阵中
  • t(...)转置成一个高矩阵
于 2012-12-09T12:51:56.737 回答