【发布时间】:2017-12-26 08:02:26
【问题描述】:
我有以下代码,其目的是将一个序列转录为三个元组。它可以正确执行,但在应用于非常大的数据集(即数百万行)时特别慢。
我怀疑罪魁祸首是向量中的“for - 循环”(特别是 for y: 循环),并且觉得应该有一种更有效的方法使用其中一个 apply 函数 - 不幸的是我不太熟悉这种方法,想请求一些帮助(拜托!)。
M.Order <- function(in.vector) {
return.str <- vector()
in.vector <- strsplit(in.vector, ' > ', fixed = T)
for (x in 1:length(in.vector)) {
output <- NULL
if(length(in.vector[[x]]) == 1) {
output <- paste0(in.vector[[x]], '|NULL|NULL')
} else if(length(in.vector[[x]]) == 2) {
output <- paste(c(in.vector[[x]][1], in.vector[[x]][2],'NULL'), collapse='|')
} else if(length(in.vector[[x]]) == 3) {
output <- paste(in.vector[[x]], collapse = '|')
} else for (y in 1:(length(in.vector[[x]])-2)) {
output <- ifelse(length(output) == 0
,paste(in.vector[[x]][y:(y+2)], collapse = '|')
,paste0(output, ' > ', paste(in.vector[[x]][y:(y+2)], collapse = '|'))
)
}
return.str[x] <- output
}
return (return.str)
}
orig.str <- rbind.data.frame(
'A > B > C > B > B > A > B > A > C',
'A > B',
'A > C > B',
'A',
'A > B > D > C')
colnames(orig.str) <- 'Original'
orig.str$Processed <- M.Order(as.character(orig.str$Original))
orig.str
返回(正确)
Original Processed
1 A > B > C > B > B > A > B > A > C A|B|C > B|C|B > C|B|B > B|B|A > B|A|B > A|B|A > B|A|C
2 A > B A|B|NULL
3 A > C > B A|C|B
4 A A|NULL|NULL
5 A > B > D > C A|B|D > B|D|C
【问题讨论】:
-
旁白:
rbind将行绑定在一起。如果您只想创建一个 data.frame,请使用data.frame,而不是rbind.data.frame。您也可以在此调用中直接分配列名。无需单独进行。 -
我对速度不是特别了解,但我知道
bind_rows的dplyr 包比rbind快。希望它有所帮助,因为它不是功能的答案