根据变量函数的结果过滤掉行

时间:2017-02-18 14:19:24

标签: r dplyr

我正在寻找一种更快的方法来过滤掉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

2 个答案:

答案 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