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

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

Набор данных, по сути, считает людей. Например, 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

person Tea Tree    schedule 27.02.2020    source источник
comment
Что такое Имя1, Имя2 .....? Как они заменяются на 0,1?   -  person Aminul    schedule 27.02.2020
comment
Имена представляют собой список, указывающий, что они соответствуют критериям для Var1, Var2, Var3 соответственно. Таким образом, Var1 Name1 означает, что наблюдение Name1 должно получить значение 1 для Var1.   -  person Tea Tree    schedule 27.02.2020
comment
Итак, в основном вы хотите заменить Name1, Name2 .... некоторыми другими значениями. В этом случае вы можете использовать лямбда-функцию для добавления критериев / условий.   -  person Aminul    schedule 27.02.2020
comment
Замена да, но также убедитесь, что значения помещены в правильную строку (так как теперь строка не соответствует наблюдениям).   -  person Tea Tree    schedule 27.02.2020
comment
Я думаю, вам нужно сделать свой вопрос более ясным, чтобы мы могли вам помочь.   -  person DJV    schedule 27.02.2020
comment
У вас не может быть набора данных (объекта, подобного фрейму данных), беспорядочного или иного, со столбцами неравной длины. Откуда берутся данные?   -  person Edward    schedule 27.02.2020
comment
Он импортирован с помощью read.csv. Пустые ячейки - это пустые строки.   -  person Tea Tree    schedule 27.02.2020
comment
У вас есть ошибка в вашем выводе. Var2 должен быть 1,0,1,1.   -  person Edward    schedule 27.02.2020


Ответы (2)


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")
person Darren Tsai    schedule 27.02.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)
person Edward    schedule 27.02.2020