【问题标题】:Adding same observations from 2 different groups. Plyr or tapply?添加来自 2 个不同组的相同观察结果。 Plyr 还是 tapply?
【发布时间】:2014-05-06 14:16:08
【问题描述】:

希望创建一个函数。

我想在给定组中添加观察的出现次数(例如 5 次,5 次出现 2 次)。 Business在一个Week内的相同Days数将被求和。总和值将位于新行“Total-occurrences”中。

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

【问题讨论】:

  • 你有什么问题?
  • 抱歉,这是创建一个函数来创建一个新行“Total-Occurrences”。我想在每个给定的业务和周数中添加相同“天”的总出现次数。

标签: r function sum plyr tapply


【解决方案1】:

如果我正确理解您的问题,您希望将数据框按BusinessWeekDays 分组,并在新列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:

require(plyr)

ddply(df, .(Business, Week, Days), nrow)

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

在这两种解决方案之间,dplyr 方法可能更快。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多