R:对同一列进行行操作,以产生N个以上的列
我试图根据数据表中的一列(路径)生成多个列。我的数据集目前有600万行 编辑:包含最简单的数据集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
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)))))