我有兴趣获取data.frame的列,其中列中的值是管道分隔的,并从管道分隔的值创建虚拟变量.
例如:
让我们说我们开始吧
df = data.frame(a = c("Ben|Chris|Jim", "Ben|Greg|Jim|", "Jim|Steve|Ben"))
> df
a
1 Ben|Chris|Jim
2 Ben|Greg|Jim
3 Jim|Steve|Ben
Run Code Online (Sandbox Code Playgroud)
我有兴趣最终得到:
df2 = data.frame(Ben = c(1, 1, 1), Chris = c(1, 0, 0), Jim = c(1, 1, 1), Greg = c(0, 1, 0),
Steve = c(0, 0, 1))
> df2
Ben Chris Jim Greg Steve
1 1 1 1 0 0
2 1 0 1 1 0
3 1 0 1 0 1
Run Code Online (Sandbox Code Playgroud)
我事先并不知道该领域有多少潜在价值.在上面的示例中,变量"a"可以包括1个值或10个值.假设它是一个合理的数字(即<100个可能的值).
有什么好办法吗?
这是使用dplyr和的一个选项tidyr:
library(dplyr)
library(tidyr)
df %>% tibble::rownames_to_column(var = "id") %>%
mutate(a = strsplit(as.character(a), "\\|")) %>%
unnest() %>% table()
# a
# id Ben Chris Greg Jim Steve
# 1 1 1 0 1 0
# 2 1 0 1 1 0
# 3 1 0 0 1 1
Run Code Online (Sandbox Code Playgroud)
基础R中的类似物是:
df$a <- as.character(df$a)
s <- strsplit(df$a, "|", fixed=TRUE)
table(id = rep(1:nrow(df), lengths(s)), v = unlist(s))
Run Code Online (Sandbox Code Playgroud)
数据:
df = data.frame(a = c("Ben|Chris|Jim", "Ben|Greg|Jim", "Jim|Steve|Ben"))
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用cSplit_e从splitstackshape包.
按列拆分数据框,将其a与fill0和drop原始列拆分.
library(splitstackshape)
cSplit_e(df, "a", "|", type = "character", fill = 0, drop = T)
# a_Ben a_Chris a_Greg a_Jim a_Steve
#1 1 1 0 1 0
#2 1 0 1 1 0
#3 1 0 0 1 1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
675 次 |
| 最近记录: |