每组的案例数,基于另一个变量的最小值,也是每个相同的组

时间:2017-07-11 23:00:58

标签: r dplyr

我有以下类型的数据框:

Person General_Type Specific_Type Age
  A         X            XY        2
  A         Y            YZ        3
  A         Y            YY        3
  B         X            XY        5
  B         Y            YZ        6
  B         X            XX        8

我要做的是:

对于每个人,我想计算他第一次生成Specific_Type YZ的年龄。

然后,我想计算他生成General_Type X的所有情况,直到我之前计算的年龄。

到目前为止我有什么:

原始数据位于数据框' data_file'。

我成功地使用了这个年龄:

Person <- c('A', 'B')
df <- data.frame(Person)

library(dplyr)

Initial_Age <- (data_file %>% 
        group_by_(.dots=c("Person","Specific_Type")) %>% 
        filter(all(Specific_Type == "YZ")) %>% 
        summarize(Age_Calc = min(Age)))
df$Initial_Age <- Initial_Age$Age_Calc

我可以使用以下内容获取每个General_Type的每个人的总数:

total_count <- (data_file %>% 
                 group_by(Person, General_Type) %>% 
                  filter(all(General_Type == "x")) %>% 
                 summarize(count = n()))

但我不确定如何在后者中使用前者的结果。

具体来说,我要问的是如何计算每个人的General_Type X的数量,直到他第一次生成Specific_Type YZ的年龄。

我目前正在使用dplyr,但如果他们更喜欢,我会对其他解决方案持开放态度。

1 个答案:

答案 0 :(得分:2)

这应该做的工作:

data_file %>% 
  group_by(Person) %>% 
  filter(Age <= first(Age[Specific_Type == "YZ"])) %>% 
  summarise(count = sum(General_Type == "X"))
# # A tibble: 2 x 2
#   Person count
#    <chr> <int>
# 1      A     1
# 2      B     1

注意:如果您的数据尚未排序,请使用min代替first

数据:

data_file <- read.table(text = "
Person General_Type Specific_Type Age
  A         X            XY        2
  A         Y            YZ        3
  A         Y            YY        3
  B         X            XY        5
  B         Y            YZ        6
  B         X            XX        8
                        ", header = TRUE, stringsAsFactors = FALSE)