我想在我的数据框中使用var1
和var2
的独特组合:
foo <- data.frame(var1 = c(1,1,2,2,2,2,3,3,3,3,3,4,4,4,4),
var2 = c(1,1,1,1,2,2,1,1,2,2,2,2,2,3,3))
正如已经指出的那样,unique(foo)
会产生这样的结果:
var1 var2
1 1 1
2 2 1
3 2 2
4 3 1
5 3 2
6 4 2
7 4 3
根据独特的组合,我如何获得:
n
,var1
值和svar
,每个var1
值var2
值的总和。输出可能如下所示:
var1 n svar
1 1 1 1
2 2 2 3
3 3 2 3
4 4 2 5
答案 0 :(得分:4)
unique(foo)
应该会告诉你这里的情况。
更新2014:使用dplyr
代替plyr
我建议查看库plyr
以获取其他聚合类型任务,或tapply()
,aggregate()
等等的基本R等价物。
虽然本练习多余,但以下是使用plyr的方法:
library(plyr)
ddply(foo, .(var1), unique)
请注意,您可以使用任意数量的函数替换unique,例如查找var2的均值和sd,如下所示:
ddply(foo, .(var1), summarise, mean = mean(var2), sd = sd(var2))
回复编辑
现在,您可以更合理地使用plyr()
。从我们从上面学到的东西:
x <- unique(foo)
与plyr合并:
ddply(x, .(var1), summarise, n = length(var2), sum = sum(var2))
应该给你你想要的东西。
答案 1 :(得分:2)
我希望我能理解你的问题,试试:
unique(foo)
问题编辑后:
不要写与@Chase相同,一个非常简单但不太优雅的解决方案可能是:
foo$var12 <- paste(foo$var1, foo$var2, sep='|') # the two variables combined to one
table(foo$var12) # and showing its frequencies
输出是一个表格当然:
1|1 2|1 2|2 3|1 3|2 4|2 4|3
2 2 2 2 3 2 2
答案 2 :(得分:1)
答案与你说的不同,但我相信我的代码比我相信你的答案更多,我不能让自己犯下命名变量“sum”的罪: p>
newfoo <- data.frame(
var1=unique(foo$var1),
n = with(foo, tapply(var2, var1, length) ),
svar = with(foo, tapply(var2, var1, sum) ) )
newfoo
# var1 n svar
#1 1 2 2
#2 2 4 6
#3 3 5 8
#4 4 4 10
编辑:(最初没想到Chase 做了什么试图告诉我。)
newfoo <- data.frame(
var1=unique(unique(foo)$var1),
n = with(unique(foo), tapply(var2, var1, length) ),
svar = with(unique(foo), tapply(var2, var1, sum) ) )
> newfoo
var1 n svar
1 1 1 1
2 2 2 3
3 3 2 3
4 4 2 5