group_by и применить код к каждому элементу в группе, используя условия - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть такие данные:

  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 .Я также думал об использовании функции aggregate , но мне не повезло.

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

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

По сути, я хочу новую переменную, которая будет определяться с использованием определенных условий и применяться к каждому идентификатору при группировке по членству.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018
 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()
0 голосов
/ 06 декабря 2018
library(dplyr)
df %>% group_by(membership) %>% 
       mutate(code=case_when(
        sum(AdultChild=='A', na.rm = T)==2 & sum(AdultChild=='C', na.rm = T)==0 ~ 'X1',
        sum(AdultChild=='A', na.rm = T)==1 & sum(AdultChild=='C', na.rm = T)>=1 ~ 'X2',
        TRUE ~ 'X3'
))
 # A tibble: 7 x 4
# Groups:   membership [3]
ID membership AdultChild code 
<int>      <int> <fct>      <chr>
1     1          1 A          X1   
2     2          1 A          X1   
3     3          2 A          X2   
4     4          2 C          X2   
5     5          2 C          X2   
6     6          3 A          X1   
7     7          3 A          X1
...