首页 > 解决方案 > 如何整理列是虚拟变量而单元格值是观察名称的数据集?

问题描述

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

数据集本质上计算了个人。例如,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

标签: rtidyrdata-wrangling

解决方案


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)

推荐阅读