daply自定义输出对象值

时间:2011-08-10 18:53:51

标签: r plyr

我有一个键/值对列表,并希望将其转换为二维矩阵,其中单元格表示每个键/值组合的计数。这是一个示例数据框

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函数中执行此操作。我只是没有弄清楚如何并欣赏这方面的帮助。

2 个答案:

答案 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)