我正在寻找一种更快的方法来过滤掉data.frame行,例如,前5个变量中的任意三个变量在给定的向量中都有值。我使用的命令(速度非常慢 - data.frame有超过20M行)就像这样:
<?php
ob_start();
include 'config.php';
if(isset($_POST['genelayarkaydet'])) {
$ayarkaydet=$db->prepare("UPDATE ayar1 set
ayar_title=sitetitle,
ayar_duyuru=duyuru,
ayar_dusman=dusman
WHERE ayar_id=0");
$update=$ayarkaydet->execute(array(
'sitetitle' => $_POST['ayar_title'],
'duyuru' => $_POST['ayar_duyuru'],
'dusman' => $_POST['ayar_dusman']
));
if($update) {
echo "Degistirildi!!!!!!";
}
else {
echo "olmadı la";
}
}
?>
似乎x %>%
rowwise %>%
filter(sum(!is.na(match(c(V1,V2,V3,V4,V5),c(9,11,33,43,44))))==3 & V6!=13)
不是最好的方法。 (当我尝试rowwise
时,它会占用所有内存,导致我的机器无响应)
可重现的例子:
purrr::by_row
答案 0 :(得分:3)
rowwise
很慢,如果可以,你应该避免使用它。您正在进行的操作可以进行矢量化:
v <- c(9,11,33,43,44)
x1 <- x %>%
mutate_at(1:5, funs(. %in% v)) %>%
filter(rowSums(select(., 1:5)) == 3 & V6 != 13)
即使您提供大量数据集,它也非常快:
system.time(x1 <- x %>% mutate_at(1:5, funs(. %in% v)) %>% filter(rowSums(select(., 1:5)) == 3 & V6 != 13))
# user system elapsed
# 3.561 0.807 4.465
答案 1 :(得分:1)
我们也可以使用data.table
来加快速度
library(data.table)
v <- c(9,11,33,43,44)
setDT(x)[x[, Reduce(`+`, lapply(.SD, function(x) x %in% v))==3 & V6 != 13, .SDcols = 1:5]]
library(fastmatch)
system.time(setDT(x)[x[, Reduce(`+`, lapply(.SD, function(x) !is.na(fmatch(x, v))))==3
& V6 != 13, .SDcols = 1:5]])
# user system elapsed
# 3.75 0.92 4.68