使用停止值聚合不规则长度的组中的值

时间:2017-06-08 15:03:48

标签: r grouping

我正在尝试使用手动输入的关键字创建值组。例如,如果我有一个rollcall表,其值可以使用以下代码生成

df <- data.frame(name = c("Fred", "Victoria", "Jim", "Sally", "Ted", "Pamela", "end", "Victoria", "Fred", "Sally", "end", "Sally", "Pamela"), 
                 sex = c("man", "woman", "man", "woman", "man", "woman", "neither", "woman", "man", "woman", "neither", "woman", "woman"))

是否有可能将这些值分组为几天,以便我有三天时间安排,以便人们可以问一个问题,“在哪一天,莎莉和一个男人在一起”?

2 个答案:

答案 0 :(得分:1)

您可以使用cumsum创建日期:

df$day <- cumsum(df$name == 'end')
df <- df[df$day != 'end', ]
unique(df$day[df$sex == 'man' & df$day %in% df$day[df$name == 'Sally']])
# [1] 0 1

所以,&#34;在前两天,莎莉和一个男人在一起#34;

编辑:我首先误解了这个问题。错误已得到修复。

答案 1 :(得分:1)

这可能需要两个部分并使用dplyr包:

df.1 <- df %>% 
        mutate(day = cumsum(name == "end")) %>% 
        group_by(day) %>% 
        summarise(man = any(sex == "man"), woman = any(sex == "female"))

df   <- df %>%
        mutate(day = cumsum(name == "end")) %>%
        left_join(df.1, by = "day")

现在,您可以在此处搜索,因为您有day列,如果当天列中有man,并且当天有woman。要确定问题的答案,您只需使用

进行搜索即可
df$day[which(df$name == "Sally" & df$man == TRUE)]

导致

[1] 0 1

此方法创建一个表,供您沿这些组件搜索。