在 R 中创建边列表

Posted

技术标签:

【中文标题】在 R 中创建边列表【英文标题】:Creating edge list in R 【发布时间】:2015-02-08 11:26:45 【问题描述】:

我有这样的数据:

ID=c(rep("ID1",3), rep("ID2",2), "ID3", rep("ID4",2))
item=c("a","b","c","a","c","a","b","a")

data.frame(ID,item)

ID1 a
ID1 b
ID1 c
ID2 a
ID2 c
ID3 a
ID4 b
ID4 a

我需要它作为这样的边缘列表:

a;b
b;c
a;c
a;c
b;a

前三个边来自 ID1,第四个来自 ID2,ID3 没有边,所以没有任何边,第五个来自 ID4。关于如何做到这一点的任何想法?熔化/铸造?

【问题讨论】:

How to create an edge list from a matrix in R?的可能重复 【参考方案1】:

我猜应该有一个简单的igrpah 解决方案,但这里有一个使用data.table 包的简单解决方案

library(data.table)
setDT(df)[, if(.N > 1) combn(as.character(item), 2, paste, collapse = ";"), ID]

#     ID  V1
# 1: ID1 a;b
# 2: ID1 a;c
# 3: ID1 b;c
# 4: ID2 a;c
# 5: ID4 b;a

【讨论】:

不错的答案。 :) 我记得你本周或上周与if(...) else(...) 相关的评论。您想知道为什么 else() 不在 data.table 解决方案中。我不记得那是哪个问题了。您找到不需要 else() 部分的原因了吗?如果你有信息,我很想知道。 @jazzurro 我想知道if 当你想进行诸如dplyr::mutate 之类的操作时,你也必须获得else 的值,否则你不会有“足够的”价值观。在这种情况下,我正在做类似于dplyr::summarise 的事情,所以我不需要else 值(我实际上想摆脱它们,因此if)。当时提出的问题的解决方案(我猜)是 OP 在else 语句中需要NAs,并且当ifdata.table 环境中运行并由:= 运算符指定时,它会生成默认为NAs(如果未提供else)。 非常感谢您的清晰解释。 NA 的默认生成是值得了解的。再次感谢您抽出宝贵时间。【参考方案2】:

试试

 res <- do.call(rbind,with(df, tapply(item, ID, 
         FUN=function(x) if(length(x)>=2) t(combn(x,2)))))
  paste(res[,1], res[,2], sep=";")
 #[1] "a;b" "a;c" "b;c" "a;c" "b;a"

【讨论】:

谢谢!我正在使用您以前的版本:lst =2) t(combn(x,2)) else NULL) nodes=as。 data.frame(do.call(rbind,lst[!sapply(lst, is.null)]) ),但是请您告诉我如何从原始df并将它们作为“节点”中的列? @ElinaJ 您能否使用新数据集和预期结果更新您的帖子 为了清楚和匹配答案,我做了一个新主题:***.com/questions/28449118/…【参考方案3】:

这是一个更具可扩展性的解决方案,它使用与其他解决方案相同的核心逻辑:

library(plyr)
library(dplyr)

ID=c(rep("ID1",3), rep("ID2",2), "ID3", rep("ID4",2))
item=c("a","b","c","a","c","a","b","a")

dfPaths = data.frame(ID, item)
dfPaths2 = dfPaths %>% 
  group_by(ID) %>% 
  mutate(numitems = n(), item = as.character(item)) %>%
  filter(numitems > 1)


ddply(dfPaths2, .(ID), function(x) t(combn(x$item, 2)))

【讨论】:

您可以在dplyr 内使用do dfPaths %&gt;% group_by(ID) %&gt;% filter(n()&gt;1) %&gt;% do(data.frame(V1=combn(as.character(.$item), 2, FUN=paste, collapse=";"))) 执行此操作 @akrun 谢谢——不知道。

以上是关于在 R 中创建边列表的主要内容,如果未能解决你的问题,请参考以下文章

通过网状在R中创建python列表

如何在R中创建列表的复杂层次结构

在R中创建具有特定迭代的列表

如何在 R 中创建单个分支实体/死胡同的外部叶子列表?

使用特定迭代在R中创建列表

R: 从条件列表中创建指标列。