我需要知道一个人是属于一个唯一的组还是几个组,并添加一个新的列,其中包含描述这种情况的布尔值。
示例数据:
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的一些窗口函数可以实现,但我无法理解。 提前谢谢。
答案 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选项,起诉ifelse
和unique
:
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