首页 > 解决方案 > group_by 并使用条件将代码应用于组中的每个元素

问题描述

我有这样的数据:

  ID  membership   AdultChild    
   1     1           A
   2     1           A 
   3     2           A  
   4     2           C  
   5     2           C
   6     3           A 
   7     3           A 
   :     :           : 

我想按成员资格分组并在计算AdultChild变量后应用“代码”,即

ID membership   AdultChild code
 1    1           A          x1
 2    1           A          x1
 3    2           A          x2
 4    2           C          x2
 5    2           C          x2
 6    3           A          x1
 7    3           A          x1
 :    :           :          :

我将有类似的条件:

count <- function(x){
if(sum(x == "A") == 2 && sum(x == "C") == 0){
  code <<-  x1
}else if (sum(x == "A") == 1 & sum(x == "C") >= 1){
  code <<- x2
}else {
  code <<- X3
} 

我尝试使用 dplyr 进行分组和变异,使用上面的函数添加一个名为code的新变量。我也考虑过使用聚合函数,但运气不佳。

df.2 <-  df %>% group_by(membership) 
         %>% mutate(n = count(AdultChild)) %>% 
         ungroup()

df.2 <-  aggregate.data.frame(df, by = membership, FUN = 
         count(df$AdultChild))

基本上,我想要一个新变量,它使用某些条件决定并在按成员资格分组时应用于每个 ID。

提前致谢。

标签: rloopsdplyraggregate

解决方案


 count <- function(x){
 if(sum(x == "A", na.rm = T) == 2 & sum(x == "C", na.rm = T) == 0){
  y <-  "4"
} else if (sum(x == "A", na.rm = T) > 2 & sum(x == "C", na.rm = T) == 0){
  y <- "5"
}else if (sum(x == "A", na.rm = T) == 1 & sum(x == "C", na.rm = T) >= 1){
  y <- "6"
}else if (sum(x == "A", na.rm = T) == 2 & sum(x == "C", na.rm = T) <= 3 & sum(x == "C", na.rm = T) >= 1){
  y <- "7"
}else {
  y <- "8"
}
}

df.2 <-  df %>% group_by(membership) %>% mutate(code = count(AdultChild)) %>% ungroup()

推荐阅读