将列的单元格值转换为新的二进制/虚拟变量

Transform the cell values of a column into new binary / dummy variables

我一直在浏览此处的类似帖子以寻求指导,但它们似乎都专注于 splitting strings within cells into distinct columns,而在我的数据中,我的所有字符串都已拆分为单独的单元格。

换句话说,我的数据是这样的:

ID word
1 blue
1 red
1 green
1 yellow
2 blue
2 purple
2 orange
2 green

但我希望它们看起来像这样:

ID blue red green yellow purple orange
1 1 1 1 1 0 0
2 1 0 1 0 1 1

我尝试使用基 R 的 table() 来执行此操作,但我收到错误消息:Error in table(df) : attempt to make a table with >= 2^31 elements 这很奇怪,因为我的数据集中几乎没有那么多元素。

我也尝试过使用 pivot_wider(),

df %>% 
  pivot_wider(ID, names_from = word, values_from = word,
       values_fn = length, values_fill = 0)

但是 运行 上面的代码给我一条错误消息,说 Column 2894 must be named. Use .name_repair to specify repair. 但我认为 pivot_wider 不接受 .name_repair 作为参数。我也不确定我是否理解为什么这里有必要,因为我只是想为每个唯一的单元格值创建一个新的二进制列。

非常感谢任何帮助!谢谢!

这是使用 dplyr 中的 mutate() 进行的修复。

library(dplyr)
library(tidyr)

ID <- c(1, 1, 1, 1, 2, 2, 2, 2)
word <- c("blue", "red", "green", "yellow", "blue", "purple", "orange", "green")
dd1 <- data.frame(ID, word)

# A tibble: 2 x 7
     ID  blue   red green yellow purple orange
  <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl>
1     1     1     1     1      1      0      0
2     2     1     0     1      0      1      1

dd1 %>%
  mutate(value = 1) %>%
  pivot_wider(names_from = word, values_from = value, values_fill = 0)

这种方法将值创建为虚拟变量,然后 values_fill = 0 填补空白。

使用data.table:

ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L)

word = c('blue', 'red', 'green', 'yellow', 'blue', 'purple', 'orange', 'green')

library(data.table)

DT = data.table(ID, word)

DT

dcast(DT, ID ~ word, fill = 0L, fun.agg = \(x) ifelse(x == 0, 0, 1))

输出

   ID blue green orange purple red yellow
1:  1    1     1      0      0   1      1
2:  2    1     1      1      1   0      0