dplyr group_仅由一些值组成

dplyr group_仅由一些值组成,r,dplyr,R,Dplyr,我有一个数据框,df是这样的…df=data.frame(w=c('CT','CT','CT','CT','CT','CT','CT'),x=c('PF','PF','MF','MF','AF','AF'),y=sample(字母,6),z=seq(1:6)) 它已按w和y分组。我想用x做一个新的分组,但前提是x=PF或MF。如果x=AF,我需要保持y,否则NA或其他唯一的数字就可以了。汇总函数将是z的和,因此最终的数据帧将是 w x y z CT PF NA 3 CT MF NA 7

我有一个数据框,df是这样的…
df=data.frame(w=c('CT','CT','CT','CT','CT','CT','CT'),x=c('PF','PF','MF','MF','AF','AF'),y=sample(字母,6),z=seq(1:6))
它已按w和y分组。我想用x做一个新的分组,但前提是x=PF或MF。如果x=AF,我需要保持y,否则NA或其他唯一的数字就可以了。汇总函数将是z的和,因此最终的数据帧将是

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

我正在使用dplyr,并试图
分组(Flyway%在%c('MF','PF'))
但这只会得到一个带有TRUE/FALSE的新列。也许我应该看看dplyr外面?谢谢。

您可以先更改
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()

您可以先更改
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()

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

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”列中的不同值是由于在构造数据集时未设置种子。

我们也可以使用
数据。表
。将“data.frame”转换为“data.table”(
setDT(df)
),对于“x”中不是“AF”的值,将(
:=
)y分配到“NA”,按“w”、“x”和“y”分组,我们得到“z”的

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”列中的不同值是由于在构造数据集时未设置种子。

谢谢。我认为这相当简单,但从未修改过分组变量。这将是真正有用的未来!谢谢我认为这相当简单,但从未修改过分组变量。这将是真正有用的未来!