我有以下类型的数据框:
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,但如果他们更喜欢,我会对其他解决方案持开放态度。
答案 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)