【发布时间】:2021-11-06 15:18:19
【问题描述】:
对于我正在进行的项目,我正在分析两个数据集,每个数据集有 500,000 行。我必须根据一个特定列中的值过滤这些行。这是我编写的用于小标题的函数:
theme_analyser <- function(tibble_to_analyse) {
for (i in 1:nrow(tibble_to_analyse)) {
theme <- unlist(strsplit((tibble_to_analyse$themes[i]), ";"))
if (any(theme %in% themes_to_use)){
next}
else {
tibble_to_analyse <- tibble_to_analyse[-i,]
}
}
}
在此函数中,themes_to_use 是一个包含一组字符串值的向量。主题列采用多个值,每个值之间用“;”分隔。因此,我首先将这些值拆分并取消列出。
此代码的问题在于它运行速度太慢。它设法在 18 小时内完成了仅 250k 行的工作。我有哪些方法可以加快这个过程,从而减少花费太多时间?
假设我有如下数据集:
A B
1 "bright"
2 "shiny"
3 "bright"
我想过滤行,所以我只得到B 列等于“亮”的行。我的代码用于选择themes 列至少等于值向量的值之一的行。
提前谢谢你。
【问题讨论】:
-
请发布一些示例输入和预期输出,r.e. stackoverflow.com/help/minimal-reproducible-example
-
没有数据很难确定,但似乎
grepl可以让您识别要包含的案例的行号而无需循环。 -
每次满足
else条件时,您都在编写整个tibble_to_analyse(少一行)。不要那样做。相反,标记您要删除的行并在循环完成后删除这些行。
标签: r dataframe loops for-loop if-statement