R:对同一列进行行操作,以产生N个以上的列

R:对同一列进行行操作,以产生N个以上的列,r,R,我试图根据数据表中的一列(路径)生成多个列。我的数据集目前有600万行 编辑:包含最简单的数据集 set.seed(24); DATA <- data.frame(path=paste0(sample(LETTERS[1:3], 25, replace=TRUE),">",sample(LETTERS[1:3], 25, replace=TRUE)), value=rnorm(25)) 我使用的旧版本代码是: DATA$A <- sapply(DATA$path, funct

我试图根据数据表中的一列(路径)生成多个列。我的数据集目前有600万行

编辑:包含最简单的数据集

set.seed(24);
DATA <- data.frame(path=paste0(sample(LETTERS[1:3], 25, replace=TRUE),">",sample(LETTERS[1:3], 25, replace=TRUE)), value=rnorm(25))
我使用的旧版本代码是:

DATA$A <- sapply(DATA$path, function(x) { if(grepl("A", x)){1}else{0}})
DATA$B <- sapply(DATA$path, function(x) { if(grepl("B", x)){1}else{0}})
DATA$A为什么不简单:

DATA$A = grepl('A', DATA$path) + 0L

我们可以
使用
拆分
路径列,并在该列('Un1')中获得
唯一的
元素。循环“Un1”并使用
grepl
查找匹配项

Un1 <- sort(unique(unlist(strsplit(as.character(DATA$path), '>'))))
DATA[Un1] <- lapply(Un1, function(x) as.integer(grepl(x, DATA$path)))
或者在拆分“路径”列后,我们可以在列上循环,应用
model.matrix
并将
|
Reduce一起使用

 d1 <- do.call(rbind.data.frame,strsplit(as.character(DATA$path), '>'))
 names(d1) <- paste0('path', 1:2)
 cbind(DATA, +(Reduce(`|`,lapply(d1, function(x) model.matrix(~0+x)))))

d1您必须输入多少列?超过4/5?@ColonelBeauvel是的,我需要超过4/5列,可能10列或更多,这取决于路径内容。@akrun我根据您的示例添加了示例数据,我认为这稍微澄清了问题。这也是可用的,但我正在寻找一个更简洁的解决方案,它不涉及遍历整个数据集N(我需要创建的列数)次。
library(qdapTools)
cbind(DATA, +(!!mtabulate(strsplit(as.character(DATA$path), '>')) ))
 d1 <- do.call(rbind.data.frame,strsplit(as.character(DATA$path), '>'))
 names(d1) <- paste0('path', 1:2)
 cbind(DATA, +(Reduce(`|`,lapply(d1, function(x) model.matrix(~0+x)))))