我遇到了一个问题,我需要计算某个网络中用户的程度中心性我正在使用R为此目的但由于内存问题R无法计算该值,因为我有一个非常大的数据帧。我的数据看起来像是一个csv文件
uID1 uID2
6661 1591
6661 28065
6661 42783
6661 3113
6661 21647
6661 3825
6661 29695
1003905 2372780
1003905 7712239
1003905 7456377
1003905 3617193
1003905 2378092
1003905 326275
1003905 1389620
1003905 2970597
1003905 4111006
8484 3062783
8484 12173837
8484 735670
输出将是一列的数据框uId和其他中心性分数 uID中心分数
6661 20
.
.
.
8484 2
我想要的是使用java来计算学位中心性分数,因为有人建议我使用java,但我没有任何java知识我只是使用R来进行分析。我希望我会得到答复。
答案 0 :(得分:0)
用于SNA分析的Java网络库在我的经验中有点受限。 JUNG需要大量的样板代码,所有的泛型都不容易理解正在发生的事情(而且项目已经死了大约5年了),GraphStream很棒,但有点不稳定,有时需要与开发者合作以找出一些错误等等。
如果我是你,我只需使用R interface for igraph,因为你有一些R经验。它是用C语言编写的,因此主要没有效率问题。
举一个例子:我用博士校准数据的动态网络模型之一与JUNG运行了一个多星期,我无法轻松提升性能。同一模拟的R变体在一天内完成。我知道那种比较并没有真正说出来,但仍然把它当作一个侧面信息。
答案 1 :(得分:0)
度中心度只是g的基础简单图中顶点的顶点度数列表。
在C#中,这将是:
public string DegreeCentrality(List<Tuple<long, long>> items)
{
var sb = new StringBuilder();
var total = new List<long>();
total.AddRange(items.Select(o => o.Item1).ToList());
total.AddRange(items.Select(o => o.Item2).ToList());
foreach (var group in total.GroupBy(o => o).OrderByDescending(o => o.Count()))
{
sb.Append(string.Format("{0}\t{1}\n", group.Key, group.Count()));
}
return sb.ToString();
}
输入:
2 1
1 5
5 4
4 6
6 1
1 3
会回来:
1 4
2 1
3 2
4 3
5 2
6 2
编辑:
File.WriteAllText(@"d:\out.txt", DegreeCentrality(File.ReadAllText(@"d:\in.csv").Split('\n').Skip(1).Select(row => row.Trim().Split(',')).Select(item => Tuple.Create(long.Parse(item[0]), long.Parse(item[1]))).ToList()));
+评论
File.WriteAllText(
@"d:\out.txt", //8) write output here
DegreeCentrality( //7) Use list to generate results
File.ReadAllText(@"d:\in.csv") //1) read input from here
.Split('\n') //2) split content to lines
.Skip(1) //3) skip header
.Select(row => row.Trim().Split(',')) //4) split at ','
//5) parse text as number pair
.Select(item => Tuple.Create(long.Parse(item[0]), long.Parse(item[1])))
.ToList() //6) Execute results in list
));
或临时变量
var input = File.ReadAllText(@"d:\in.csv");
var lines = input.Split('\n').Skip(1);
var arries = lines.Select(row => row.Trim().Split(null));
var items = arries.Select(item => Tuple.Create(long.Parse(item[0]), long.Parse(item[1]))).ToList();
File.WriteAllText(@"d:\out.csv", DegreeCentrality(items));