我的concat.split.multiple
函数非常需要重写以提高效率。我已经在cSplit
函数中进行了一些工作,如果您有一个特别大的数据集,这可能会很有用。
以下是我如何使用cSplit
解决您提供的问题:
table(
cSplit(
cSplit(data_h, splitCols = 2, sep = ",",
direction = "long", makeEqual = FALSE),
splitCols = 1, sep = ",", direction = "long",
makeEqual = FALSE))
看起来这东西也相当有效...
首先,要测试的函数:
fun1 <- function() table(cSplit(cSplit(df, 2, ",", "long", FALSE), 1, ",", "long", FALSE))
fun2 <- function() {
spl <- function(x) strsplit(as.character(x), ",")[[1]]
eg <- function(aaa, vvv) expand.grid(aaa = spl(aaa), vvv = spl(vvv))
dd <- do.call("rbind", Map(eg, df$A, df$V))
xtabs(data = dd)
}
其次,是一些样本数据。更改 Nrows
并重新生成以查看对不同大小的 data.frame
的影响。
set.seed(1)
Nrow <- 100
aaa <- 100:200
vvv <- LETTERS
maxA <- 10
maxV <- 10
Aaa <- sample(maxA, Nrow, TRUE)
Vvv <- sample(maxV, Nrow, TRUE)
A <- vapply(seq_along(Aaa), function(x)
paste(sample(aaa, Aaa[x], TRUE), collapse = ","), character(1L))
V <- vapply(seq_along(Vvv), function(x)
paste(sample(vvv, Vvv[x], TRUE), collapse = ","), character(1L))
df <- data.frame(A, V)
head(df)
比较这两种方法以确保结果相同:
X <- fun1()
Y <- fun2()
all(X == Y[dimnames(X)[[1]], dimnames(X)[[2]]])
基准测试(针对100行数据)。
library(microbenchmark)
microbenchmark(fun1(), fun2(), times = 10)
基准测试(针对1000行数据)。
microbenchmark(fun1(), fun2(), times = 10)