将列的单元格值转换为新的二进制/虚拟变量
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
我一直在浏览此处的类似帖子以寻求指导,但它们似乎都专注于 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