如何整理列是虚拟变量且单元格值是观察名称的数据集?

How to tidy dataset where columns are dummy variables and cell values are names of observations?

我有一个非常混乱的数据集,其中每一列(正确地)对应于感兴趣的变量。

数据集基本上统计了个体。例如,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

芭芭拉喜欢巧克力和草莓冰淇淋,但数据集很乱,杉杉的名字和芭芭拉的名字在同一行。不应该是这样的。第一行应代表 Barbara 的值,单元格值应为 1/0 或 T/F,表明 Barbara 是否喜欢某种口味的冰淇淋。

简而言之,我希望它看起来像下面这样

Var1   Var2   Var3
1      1      0
1      0      1
0      1      0
1      1      0
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)
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")