如何整理列是虚拟变量且单元格值是观察名称的数据集?
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")
我有一个非常混乱的数据集,其中每一列(正确地)对应于感兴趣的变量。
数据集基本上统计了个体。例如,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)
:将字符串转换为1values_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")