一个简单的问题,我在咨询了我认为有用的软件包(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%
答案 0 :(得分:2)
以下是reshape2
和data.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