我有一个键/值对列表,并希望将其转换为二维矩阵,其中单元格表示每个键/值组合的计数。这是一个示例数据框
doc_id,link
1,http://example.com
1,http://example.com
2,http://test1.net
2,http://test2.net
2,http://test5.net
3,http://test1.net
3,http://example.com
4,http://test5.net
目前,我正在使用R的 plyr 包和以下命令进行这种转换:
link_matrix <- daply(link_list, .(doc_id, link), summarise, nrow(piece))
这是结果矩阵对象:
doc_id http://example.com http://test1.net http://test2.net http://test5.net
1 List,1 NULL NULL NULL
2 NULL List,1 List,1 List,1
3 List,1 List,1 NULL NULL
4 NULL NULL NULL List,1
结果数组条目很好 - 它们给我键/值计数;但我真正需要的是结果矩阵中的数值。它应该是这样的:
doc_id http://example.com http://test1.net http://test2.net http://test5.net
1 2 0 0 0
2 0 1 1 1
3 1 1 0 0
4 0 0 0 0
我可以通过迭代矩阵元素并执行必要的转换来完成此操作,但我很确定有一个更好的解决方案,允许我直接在daply
函数中执行此操作。我只是没有弄清楚如何并欣赏这方面的帮助。
答案 0 :(得分:3)
您可以通过以下简化代码来完成此操作(即删除summarise
):
daply(link_data, .(doc_id, link), nrow)
doc_id http://example.com http://test1.net http://test2.net http://test5.net
1 2 NA NA NA
2 NA 1 1 1
3 1 1 NA NA
4 NA NA NA 1
然后,如果删除NA
值很重要,请使用数组子集:
aa <- daply(link_data, .(doc_id, link), nrow)
aa[is.na(aa)] <- 0
aa
link
doc_id http://example.com http://test1.net http://test2.net http://test5.net
1 2 0 0 0
2 0 1 1 1
3 1 1 0 0
4 0 0 0 1
答案 1 :(得分:0)
使用cast
中的reshape
功能。
library(reshape)
cast(transform(mydf, value = 1), doc_id ~ link)