Как проверить, присутствует ли определенный флаг для группы в r? - PullRequest
1 голос
/ 04 марта 2020

У меня есть следующее dataframe, я не уверен, как бы я это сделал в dplyr.

df_test <- data.frame(group=c("A","A","B","C","C"), var=c("1","1","1","2","3"),var2=c("a","a","b","c","c"),flag=c("1","0","0","1","0"))

Я хочу знать для каждой группы переменных и var, был ли флаг и значение var 2, которому он соответствует?

df_result<-data.frame(group=c("A","B","C","C"),var=c("1","1","2","3"),flag_yes=c("1","0","1","0"),var2_distinct=c("a","na","c","na"))

Ответы [ 3 ]

2 голосов
/ 04 марта 2020

Мы можем сгруппировать по 'group', 'var', проверить any 'flag' равно 1 и paste элементы 'var2', которые соответствуют 'flag' 1, и изменить "" на NA с na_if

library(dplyr)    
df_test %>%
    group_by(group, var) %>% 
    summarise(flag_yes = +(any(flag == "1")),
             var2_distinct = na_if(toString(var2[flag == "1"]), ""))     
# A tibble: 4 x 4
# Groups:   group [3]
#  group var   flag_yes var2_distinct
#  <fct> <fct>    <int> <chr>        
#1 A     1            1 a            
#2 B     1            0 <NA>         
#3 C     2            1 c            
#4 C     3            0 <NA>      

Если нам нужно также количество отдельных элементов

df_test %>%
    group_by(group, var) %>% 
    summarise(flag_yes = +(any(flag == "1")),
             var2_distinct = na_if(toString(var2[flag == "1"]), ""),
             num_distinct = n_distinct(var2[flag == "1"]))   
# A tibble: 4 x 5
# Groups:   group [3]
#  group var   flag_yes var2_distinct num_distinct
#  <fct> <fct>    <int> <chr>                <int>
#1 A     1            1 a                        1
#2 B     1            0 <NA>                     0
#3 C     2            1 c                        1
#4 C     3            0 <NA>                     0

Или с использованием data.table

library(data.table)
setDT(df_test)[, .(flag_yes = +(any(flag == "1")), 
     var2_dstinct = na_if(toString(var2[flag == "1"]), "")), .(group, var)]
#   group var flag_yes var2_dstinct
#1:     A   1        1            a
#2:     B   1        0         <NA>
#3:     C   2        1            c
#4:     C   3        0         <NA>
1 голос
/ 04 марта 2020

Мы можем group_by group и var, создать flag_yes, если есть any flag как 1, и получить соответствующее значение var2.

library(dplyr)

df_test %>%
  group_by(group, var)  %>%
  summarise(flag_yes  = as.integer(any(flag ==  1)), 
            var2_distinct = toString(var2[flag == 1]))

#  group var   flag_yes var2_distinct
#  <fct> <fct>    <int> <chr>        
#1 A     1            1 "a"          
#2 B     1            0 ""           
#3 C     2            1 "c"          
#4 C     3            0 ""           
0 голосов
/ 04 марта 2020

База R Решение:

data.frame(do.call("rbind", lapply(split(df_test, paste0(df_test$group, df_test$var)),
       function(x){
         x$flag_yes <- ifelse(sum(as.integer(x$flag)) >= 1, 1, 0)
         x$var2_distinct <- as.character(ifelse(x$flag == 1, as.character(x$var2), ""))
         return(x)
         }
      )
    ),
  row.names = NULL
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...