从R中的衣衫褴褛数据框创建边缘列表(用于网络分析)

时间:2012-12-08 21:30:02

标签: r social-networking data-mining

我有一个粗糙的数据框,每一行都是一个或多个实体的时间,如下所示:

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

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

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

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

但它不起作用。

2)。如何将不规则数据框组成两列边列表。在上面的例子中,它将转换为:

entitya entityf
entitya entityz
entityz entityf
...

不知道如何做到这一点。任何帮助都非常感谢!

1 个答案:

答案 0 :(得分: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(...)转换为高大的矩阵