在dplyr中的组之间添加新列作为条件的结果

时间:2015-06-09 17:49:42

标签: r dplyr

我需要知道一个人是属于一个唯一的组还是几个组,并添加一个新的列,其中包含描述这种情况的布尔值。

示例数据:

df <- structure(list(group = c(1L, 1L, 2L, 2L, 3L, 3L, 3L, 1L, 2L, 
1L, 3L), person = c(955563L, 955563L, 855563L, 855563L, 744506L, 
744506L, 744506L, 444506L, 444506L, 555563L, 555563L)), .Names = c("group", 
"person"), row.names = c(NA, -11L), class = "data.frame")

结果:

group   person  same_group
1   955563  TRUE
1   955563  TRUE
2   855563  TRUE
2   855563  TRUE
3   744506  TRUE
3   744506  TRUE
3   744506  TRUE
1   444506  FALSE
2   444506  FALSE
1   555563  FALSE
3   555563  FALSE

我认为使用dplyr的一些窗口函数可以实现,但我无法理解。 提前谢谢。

3 个答案:

答案 0 :(得分:4)

尝试

library(dplyr)
df %>% 
   group_by(person) %>%
   mutate(same_group=n_distinct(group)==1)
#    group person same_group
#1      1 955563       TRUE
#2      1 955563       TRUE
#3      2 855563       TRUE
#4      2 855563       TRUE
#5      3 744506       TRUE
#6      3 744506       TRUE
#7      3 744506       TRUE
#8      1 444506      FALSE
#9      2 444506      FALSE
#10     1 555563      FALSE
#11     3 555563      FALSE

使用data.table的类似选项是

library(data.table)#v1.9.5+
setDT(df)[, same_group := uniqueN(group)==1 , by = person]

答案 1 :(得分:2)

另一个data.table选项,起诉ifelseunique

setDT(df)[,same_group:= ifelse(length(unique(group))==1,TRUE,FALSE),person]

#    group person same_group
# 1:     1 955563       TRUE
# 2:     1 955563       TRUE
# 3:     2 855563       TRUE
# 4:     2 855563       TRUE
# 5:     3 744506       TRUE
# 6:     3 744506       TRUE
# 7:     3 744506       TRUE
# 8:     1 444506      FALSE
# 9:     2 444506      FALSE
# 10:     1 555563      FALSE
# 11:     3 555563      FALSE

答案 2 :(得分:0)

df %>% group_by(group, person) %>% mutate(same_group = n() > 1) 

这会导致输出与当前接受的答案略有不同,但从您的示例中不清楚您所需的输出是什么。示例:

> df <- data_frame(group = c(1, 1, 2), person = c(123, 123, 123))
> df %>% group_by(group, person) %>% mutate(same_group = n() > 1) 
Source: local data frame [3 x 3]
Groups: group, person

  group person same_group
1     1    123       TRUE
2     1    123       TRUE
3     2    123      FALSE