添加来自2个不同组的相同观察结果Plyr还是tapply?

时间:2014-05-06 14:16:09

标签: r function sum plyr tapply

期待创建一个功能。

我想在给定组中添加观察次数(例如5次,5次出现2次)。 商家内的相同数量的天数将相加。求和值将位于新行“总发生次数”中。

tapply或plyr的工作方式,但我坚持一些细微差别。

谢谢!

14X3 matrix

Business           Week        Days
A                **1**         3
A                **1**         3
A                **1**         1 
A                  2           4 
A                  2           1
A                  2           1 
A                  2           6    
A                  2           1
B                **1**         1
B                **1**         2
B                **1**         7
B                  2           2
B                  2           2
B                  2           na

**AND BECOME**

10X4 matrix

Business            Week       Days      Total-Occurrences 
A                 **1**        3         2
A                 **1**        1         1
A                   2          1         3
A                   2          4         1
A                   2          6         1
B                 **1**        1         1
B                 **1**        2         1
B                 **1**        7         1
B                   3          2         2
B                   2          na        0

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,您希望按BusinessWeek以及Days对数据框进行分组,并计算新列{{1}中每个组的出现次数}。

Total-Occurences

肯定有不同的方法可以做到这一点。一种方法是使用df <- structure(list(Business = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), Week = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L), .Label = c("**1**", "2"), class = "factor"), Days = structure(c(3L, 3L, 1L, 4L, 1L, 1L, 5L, 1L, 1L, 2L, 6L, 2L, 2L, 7L), .Label = c("1", "2", "3", "4", "6", "7", "na"), class = "factor")), .Names = c("Business", "Week", "Days"), class = "data.frame", row.names = c(NA, -14L))

dplyr

您也可以使用require(dplyr) result <- df %.% group_by(Business,Week,Days) %.% summarize(Total.Occurences = n()) #>result # Business Week Days Total.Occurences #1 A **1** 1 1 #2 A **1** 3 2 #3 A 2 1 3 #4 A 2 4 1 #5 A 2 6 1 #6 B **1** 1 1 #7 B **1** 2 1 #8 B **1** 7 1 #9 B 2 2 2 #10 B 2 na 1

plyr

请注意,根据这些功能,输出与您在问题中发布的内容略有不同。我认为这可能是一个错字,因为在您的原始数据中没有第3周,但在您想要的输出中有。

在两个解决方案之间,require(plyr) ddply(df, .(Business, Week, Days), nrow) 方法可能更快。

我想还有其他方法可以做到这一点(但我不确定tapply)