组合,计算df列,不重复其他列

时间:2014-10-08 12:05:44

标签: r merge bind reshape

一个简单的问题,我在咨询了我认为有用的软件包(plyr,reshape,unique)之后完全难以理解

假设我有下面的df:

df <- data.frame(location=c("ny","nj","pa","ct"),
                 animal=c("dog","hamster","dog","pig"),
                 animal2=c("cat","dog","pig","dog"))

我想计算特定列中的唯一实体,然后对事件进行排名。所以在这里,我想计算动物和动物2列中的组合唯一实体。如果我使用重塑和融化,相关的位置值将在附加行中重复...但我不希望这样,因为我只想计算原始df中给出的“位置”变量的频率。

有没有办法rbind而不重复其他列?所以在这种情况下,我会有另一个名为AnimalMaster的列,它将拥有我需要的所有频率。

当我尝试count(df,c("animal","animal2"))时,它计算联合事件,这不是我想要的。或者,我也可以通过计算多列中的唯一字符串而不将它们组合来实现。有没有直接的方法可以做到这一点而不会遇到计数问题?

感谢您帮助初学者。

编辑:

我想要的输出如下:

countsdf包含列(类型,名称,频率,频率(%)),以便最上一行为:

AnimalMaster | dog | 4 | 100% 

1 个答案:

答案 0 :(得分:2)

以下是reshape2data.table

的建议
require(reshape2)
require(data.table)
dt <- data.table(melt(df, id.vars = 'location', value.name = 'animal'))
dt[, list(n=length(unique(location)), 
          percent=100*.N/dt[, length(unique(location))]), 
   by=animal]
#      animal n percent
#  1:     dog 4     100
#  2: hamster 1      25
#  3:     pig 2      50
#  4:     cat 1      25