Как привести в порядок набор данных, где столбцы являются фиктивными переменными, а значения ячеек являются именами наблюдений? - PullRequest
1 голос
/ 27 февраля 2020

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

Набор данных, в основном, учитывает отдельных лиц. Например, Var1 должен быть списком людей, для которых Var1 верно. Представьте, что переменными являются вкусы мороженого. Var1 - шоколадное мороженое. Способ записи данных таков, что вместо указания (1/0 или T / F) кому-то нравится шоколадное мороженое, набор данных просто содержит имена людей, которые любят шоколадное мороженое.

Этот набор данных в стиле списка затрудняет анализ данных, поскольку строки не соответствуют отдельным наблюдениям. Прямо сейчас, каждый столбец просто содержит список имен. Например, Var1 может быть списком (не в смысле R, а в смысле реального мира) имен людей, которые любят шоколадное мороженое.

Чтобы сделать этот набор данных пригодным для анализа, я хочу использовать информацию, чтобы каждая строка в наборе данных соответствовала наблюдению, а каждое значение ячейки соответствовало тому, является ли наблюдение T / F для данной переменной ,

Сейчас набор данных выглядит примерно так:

Var1   Var2   Var3
Name1  Name1  Name2
Name2  Name3
Name4  Name4

или с точки зрения вкусов мороженого:

Chocolate     Strawberry     Raspberry
Barbara       Barbara        Shanshan
Shanshan      Maria
Louis         Louis

Итак, Барбара любит шоколадное и клубничное мороженое но набор данных так запутан, что имя Шаншаня совпадает с именем Барбары. Это не должно быть так. Первая строка должна представлять значения Барбары, а значения ячеек должны быть либо 1/0, либо T / F, указывающие, нравится ли Барбаре определенный вкус мороженого.

Короче говоря, я бы хотел, чтобы это выглядело как следует

Var1   Var2   Var3
1      1      0
1      0      1
0      1      0
1      1      0

Ответы [ 2 ]

1 голос
/ 27 февраля 2020
library(tidyr)

df %>%
  pivot_longer(everything()) %>%
  drop_na(value) %>%
  pivot_wider(values_from = name,
              values_fill = list(name = 0),
              values_fn = list(name = ~1))

# # A tibble: 4 x 4
#   value  Var1  Var2  Var3
#   <chr> <dbl> <dbl> <dbl>
# 1 Name1     1     1     0
# 2 Name2     1     0     1
# 3 Name3     0     1     0
# 4 Name4     1     1     0

Описание

  • values_fn = list(name = ~ 1): преобразовать строки в 1

  • values_fill = list(name = 0): указать 0 заполняется при отсутствии

Данные

df <- structure(list(
  Var1 = c("Name1", "Name2", "Name4"),
  Var2 = c("Name1", "Name3", "Name4"),
  Var3 = c("Name2", NA, NA)
 ), row.names = c(NA, -3L), class = "data.frame")
1 голос
/ 27 февраля 2020
library(dplyr)
library(tidyr)
df %>% 
  pivot_longer(everything()) %>%
  filter(!is.na(value)) %>%
  pivot_wider(id_cols=value, values_from=name) %>%
  mutate_at(.vars=vars(-value), 
            .funs=~ifelse(is.na(.), 0, 1))

# A tibble: 4 x 4
  value  Var1  Var2  Var3
  <fct> <dbl> <dbl> <dbl>
1 Name1     1     1     0
2 Name2     1     0     1
3 Name3     0     1     0
4 Name4     1     1     0

Данные


library(tibble)

df <- tribble(~Var1,   ~Var2,   ~Var3,
'Name1',  'Name1',  'Name2',
'Name2',  'Name3', NA,
'Name4',  'Name4', NA)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...