2015-12-21 45 views
1

我有一个数据帧,df像这样... df = data.frame(w = c('CT','CT','CT','CT','CT','CT'), x = c('PF','PF','MF','MF','AF','AF'), y = sample(letters, 6), z = seq(1:6)) 它已经被w和y分组了。我想用x做一个新的分组,但只有在x = PF或MF的情况下。如果x = AF,我需要保留y,否则NA或其他一些唯一的数字就可以。在总结函数是z的总和,因此最终的数据帧将...dplyr group_by只有一些值

w x y z 
CT PF NA 3 
CT MF NA 7 
CT AF s 5 
CT AF h 6 

我使用dplyr并试图group_by (Flyway %in% c('MF','PF'))但只得到一个新列TRUE/FALSE。也许我应该在dplyr之外寻找?谢谢。

回答

3

你可以改变y,再组的数据和计算的z总和:

df %>% 
    ungroup %>% 
    mutate(y = replace(y, x != "AF", NA)) %>% 
    group_by(w, x, y) %>% 
    summarise(z = sum(z)) %>% 
    ungroup() 
#Source: local data frame [4 x 4] 
# 
#  w  x  y  z 
# (fctr) (fctr) (fctr) (int) 
#1  CT  AF  h  5 
#2  CT  AF  l  6 
#3  CT  MF  NA  7 
#4  CT  PF  NA  3 

或者短一点

df %>% 
    group_by(w, x, y = replace(y, x != "AF", NA)) %>% 
    summarise(z = sum(z)) %>% 
    ungroup() 
+0

谢谢。我认为这会很简单,但从未修改过分组变量。这将在未来真正有用! – tjr

1

我们也可以使用data.table。将'data.frame'转换为'data.table'(setDT(df)),对于'x'中不是'AF'的值,将'y'分配给'NA',按'w'分组, x'和'y',我们得到'z'的sum

library(data.table) 
setDT(df)[x!='AF', y:=NA_character_][,list(z=sum(z)) ,.(w,x,y)] 
# w x y z 
#1: CT PF NA 3 
#2: CT MF NA 7 
#3: CT AF b 5 
#4: CT AF o 6 

注意:'y'列中的不同值是由于在构建数据集时没有设置种子。