2015-06-09 54 views
2

我需要知道某人是否屬於一個唯一組或多個組,並添加一個具有描述此條件的布爾值的新列。添加新列作爲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

嘗試

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

完美! @akrun。非常感謝。 – Diego

+1

對不起@akrun我不知道....完成了。 – Diego

+0

@Diego謝謝你。 – akrun

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 
+1

是的你在這種情況下不需要使用'ifelse',甚至'if','setDT(df)[,same_group:= length(unique(group))== 1,person]'給出正確的結果。 – agstudy

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