gpt4 book ai didi

r - 在 R 中使用 apply 函数进行字符串连接

转载 作者:行者123 更新时间:2023-12-04 11:28:37 27 4
gpt4 key购买 nike

我有以下代码,其目的是将序列转录为三元组。它正确执行,但在应用于非常大的数据集(即数百万行)时特别慢。

我怀疑罪魁祸首是向量中的“for - 循环”(特别是 for y: 循环),并且觉得应该有一种使用应用函数之一的更有效的方法 - 不幸的是我不太熟悉这种方法和想请求一些帮助(请!)。

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

最佳答案

EDIT: remove the rollapply function, since it is slow, and created my own function. Runtime on 327,680 rows:

  • My code: 5.62 seconds
  • Your code: 5.66 seconds.

So no significant difference.



首先,拆分 '>' 字符上的字符串,如果向量没有至少三个元素,则将 NULL 添加到向量中。然后,使用 rollapply 连接三个字符的组,用“|”分隔,最后折叠这些组。
# sample data
df = data.frame(Original=c("A > B > C > B > B > A > B > A > C","A > B","A > C > B","A","A > B > D > C"),stringsAsFactors = FALSE)
for(i in 1:16) df=rbind(df,df)

groups <- function(x)
{
result <- vector("character", length(x)-2)
for(k in 1:(length(x)-2) )
{
result[k] = paste(x[k:(k+2)],collapse="|")
}
return(paste(result,collapse=" > "))
}

array1 = lapply(strsplit(df$Original," > "), function(x) if (length(x) == 1) {c(x[1],"NULL","NULL")} else {if (length(x) == 2) {c(x[1:2],"NULL")} else {x}})
df$modified = lapply(array1,groups)

输出:(作为易读性列表)
[[1]]
[1] "A|B|C > B|C|B > C|B|B > B|B|A > B|A|B > A|B|A > B|A|C"

[[2]]
[1] "A|B|NULL"

[[3]]
[1] "A|C|B"

[[4]]
[1] "A|NULL|NULL"

[[5]]
[1] "A|B|D > B|D|C"

希望这可以帮助!

关于r - 在 R 中使用 apply 函数进行字符串连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45217831/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com