Dummify столбец списков в R? - PullRequest
       5

Dummify столбец списков в R?

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

Учитывая следующую структуру:

df <- structure(list(checkPointAdditionalData_ignorePermissions = list(
    list("READ_EXTERNAL_STORAGE", "READ_CONTACTS", "READ_PHONE_STATE", 
        "WRITE_EXTERNAL_STORAGE", "ACCESS_FINE_LOCATION", "ACCESS_COARSE_LOCATION", 
        "READ_CALL_LOG"), list("READ_EXTERNAL_STORAGE", "READ_CONTACTS", 
        "READ_PHONE_STATE", "WRITE_EXTERNAL_STORAGE", "ACCESS_FINE_LOCATION", 
        "ACCESS_COARSE_LOCATION", "READ_CALL_LOG"), list("READ_EXTERNAL_STORAGE", 
        "READ_CONTACTS", "READ_PHONE_STATE", "WRITE_EXTERNAL_STORAGE", 
        "READ_CALL_LOG"), list("READ_EXTERNAL_STORAGE", "READ_CONTACTS", 
        "READ_PHONE_STATE", "WRITE_EXTERNAL_STORAGE", "READ_CALL_LOG"), 
    list("READ_EXTERNAL_STORAGE", "READ_CONTACTS", "READ_PHONE_STATE", 
        "WRITE_EXTERNAL_STORAGE", "READ_CALL_LOG"), list("READ_EXTERNAL_STORAGE", 
        "READ_CONTACTS", "READ_PHONE_STATE", "WRITE_EXTERNAL_STORAGE", 
        "READ_CALL_LOG"), list("READ_EXTERNAL_STORAGE", "READ_CONTACTS", 
        "READ_PHONE_STATE", "WRITE_EXTERNAL_STORAGE", "READ_CALL_LOG"), 
    list("READ_EXTERNAL_STORAGE", "READ_CONTACTS", "READ_PHONE_STATE", 
        "WRITE_EXTERNAL_STORAGE", "READ_CALL_LOG"), list("READ_EXTERNAL_STORAGE", 
        "READ_CONTACTS", "READ_PHONE_STATE", "WRITE_EXTERNAL_STORAGE", 
        "READ_CALL_LOG"), list("READ_EXTERNAL_STORAGE", "READ_CONTACTS", 
        "READ_PHONE_STATE", "WRITE_EXTERNAL_STORAGE", "READ_CALL_LOG")), 
    L_ignore_perm = c(7L, 7L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -10L))

Я хочу "привести в порядок" его, чтобы поместить все содержимое списков в виде дополнительных столбцов и дублировать его:

Желаемый результат:

    READ_EXTERNAL_STORAGE READ_CONTACTS READ_PHONE_STATE 
                        1             1                1
                        1             1                1
                        1             1                1
WRITE_EXTERNAL_STORAGE ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION 
                     1                    1                      1
                     1                    1                      1 
                     1                    0                      0
    READ_CALL_LOG
                1
                1
                1

и т. Д. Для каждой строки.

Посоветуйте, пожалуйста, как это сделать, я пытаюсь поиграть с tidyr функциями.Я полностью понимаю, что поток должен составлять union из всех возможных членов списков, добавлять их в качестве имен столбцов, применять ifelse для каждого столбца, чтобы поставить 1/0 в качестве значения.

Не существуетфункция, которая делает это просто и эффективно?

Я уже сделал следующее:

df %>%
  dplyr::select(checkPointAdditionalData_ignorePermissions) %>%
  dplyr::mutate(L_ignore_perm = lengths(checkPointAdditionalData_ignorePermissions)) %>% 
  unnest(checkPointAdditionalData_ignorePermissions) %>%
  dplyr::mutate(checkPointAdditionalData_ignorePermissions = unlist(checkPointAdditionalData_ignorePermissions))

и пробовал пакет dummies.

1 Ответ

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

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

library(tidyverse)

df$checkPointAdditionalData_ignorePermissions %>%
  map_df(data.frame) %>% 
  set_names(map(., levels)) %>%
  mutate_all(function(x) if_else(is.na(x), 0, 1))

   READ_EXTERNAL_STORAGE READ_CONTACTS READ_PHONE_STATE WRITE_EXTERNAL_STORAGE ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION READ_CALL_LOG
1                      1             1                1                      1                    1                      1             1
2                      1             1                1                      1                    1                      1             1
3                      1             1                1                      1                    0                      0             1
4                      1             1                1                      1                    0                      0             1
5                      1             1                1                      1                    0                      0             1
6                      1             1                1                      1                    0                      0             1
7                      1             1                1                      1                    0                      0             1
8                      1             1                1                      1                    0                      0             1
9                      1             1                1                      1                    0                      0             1
10                     1             1                1                      1                    0                      0             1
...