apply, . , length(x) NA.
nc <- ncol(temp)
t(apply(temp, 1, function(x) unique(x)[1:nc]))
# [,1] [,2] [,3] [,4] [,5]
# [1,] "424" "276" "780" "428" NA
# [2,] "560" "427" "V45" "799" NA
# [3,] "557" "V46" "584" "995" "427"
A data.table , . , .
setDT(temp)
nc <- ncol(temp)
dcast(melt(temp[, ri := seq_len(.N)], id.var = "ri")[
, value := unique(value)[1:nc], by = ri], ri ~ variable)[ , ri := NULL][]
# col1 col2 col3 col4 col5
# 1: 424 276 780 428 NA
# 2: 560 427 V45 799 NA
# 3: 557 V46 584 995 427
, . . 1e5 OP , .
temp <- temp[sample(nrow(temp), size = 3e6, replace = TRUE), ]
microbenchmark::microbenchmark(
privefl = {
p <- ncol(temp)
myf <- compiler::cmpfun(
function(x) {
un <- unique(x)
d <- p - length(un)
if (d > 0) {
un <- c(un, rep(NA_character_, d))
}
un
}
)
as.data.frame(t(apply(t(temp), 2, myf)))},
h1 = {nc <- ncol(temp)
as.data.frame(t(apply(temp, 1, function(x) unique(x)[1:nc])))},
h2 = {d <- as.data.table(temp)
nc <- ncol(d)
dcast(melt(d[, ri := seq_len(.N)], id.var = "ri")[
, value := unique(value)[1:nc], by = ri], ri ~ variable)[ , ri := NULL]},
times = 20, unit = "relative")