我有一个粗糙的数据框,每一行都是一个或多个实体的时间,如下所示:
(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
...
不知道如何做到这一点。任何帮助都非常感谢!
答案 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(...)
转换为高大的矩阵