Как преобразовать столбцы индикатора в составной столбец (из имен столбцов) - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть 3 столбца, состоящих из индикатора (0/1)

icols <- 
structure(list(delivery_group = c(0, 1, 1, 0, 0), culturally_tailored = c(0, 
0, 1, 0, 1), integrated_intervention = c(1, 0, 0, 0, 0)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -5L))

Я хотел бы вернуть односимвольный столбец «квалификаторы», чтобы имена столбцов с индикатором == 1 объединялись вСтрока, как показано ниже:

*qualifiers*
    integrated_intervention
    delivery_group
    delivery_group, culturally_tailored

    culturally_tailored 

Я попытался extdplyr :: ind (с различными вариантами) без успеха.В следующем примере произошел сбой моего сеанса R.

icols <- extdplyr::ind_to_char(col = qualifiers, ret_factor = FALSE, remove = TRUE,
              from = c("delivery_group", "culturally_tailored", "integrated_intervention"),
              mutually_exclusive = FALSE, collectively_exhaustive = FALSE)

Я обнаружил Преобразование столбцов логического индикатора в один столбец фактора , но подумал, что может быть более простое решение.

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Вот сумасшедший путь:

library(tidyverse)

icols %>%
  mutate(qualifiers = case_when(
    delivery_group & culturally_tailored == 1 ~ "delivery_group, culturally_tailored",
    delivery_group & integrated_intervention == 1 ~ "delivery_group, integrated_intervation",
    culturally_tailored & integrated_intervention == 1 ~ "culturally_tailored, integrated_intervation",
    culturally_tailored == 1 ~ "culturally_tailored",
    integrated_intervention == 1 ~ "integrated_intervention",
    delivery_group == 1 ~ "delivery_group"))
# A tibble: 5 x 4
  delivery_group culturally_tailored integrated_intervention qualifiers                         
           <dbl>               <dbl>                   <dbl> <chr>                              
1              0                   0                       1 integrated_intervention            
2              1                   0                       0 delivery_group                     
3              1                   1                       0 delivery_group, culturally_tailored
4              0                   0                       0 NA                                 
5              0                   1                       0 culturally_tailored 

0 голосов
/ 28 февраля 2019

Вы можете попробовать:

icols$collapsed <- apply(icols, 1, function(x) paste0(names(icols)[x == 1], collapse = ", "))

icols

  delivery_group culturally_tailored integrated_intervention                           collapsed
1              0                   0                       1             integrated_intervention
2              1                   0                       0                      delivery_group
3              1                   1                       0 delivery_group, culturally_tailored
4              0                   0                       0                                    
5              0                   1                       0                 culturally_tailored

Или, еще более компактно, как предложил Мориц:

apply(icols, 1, function(x) toString(names(icols)[x == 1]))
0 голосов
/ 28 февраля 2019

Я не уверен, что это «простое» решение, но вот решение, использующее tidyverse .

library(tidyverse)

icols <- tibble(
  delivery_group = c(0, 1, 1, 0, 0),
  culturally_tailored = c(0, 0, 1, 0, 1),
  integrated_intervention = c(1, 0, 0, 0, 0)
)

icols %>%
  rowid_to_column(var = "rowid") %>%
  gather(key = "qualifiers", value = "indicator", -rowid) %>%
  filter(indicator == 1) %>%
  group_by(rowid) %>%
  summarize(qualifiers = paste(qualifiers, collapse = ", ")) %>%
  ungroup() %>%
  complete(rowid = 1:nrow(icols)) %>%
  select(qualifiers)
#> # A tibble: 5 x 1
#>   qualifiers                         
#>   <chr>                              
#> 1 integrated_intervention            
#> 2 delivery_group                     
#> 3 delivery_group, culturally_tailored
#> 4 <NA>                               
#> 5 culturally_tailored

Создано в 2019-02-27 представьте пакет (v0.2.1)

...