1

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

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

2 回答 2

1
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)
于 2020-02-27T07:39:26.990 回答
1
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")
于 2020-02-27T13:05:54.487 回答