在R数据框中查找整行?

时间:2017-11-25 08:39:11

标签: r search dataframe design-patterns

我有一个包含10列的大型数据框df

例如:

col1 col2 col3 col4 col5 col6 ......
a    22   13   dd   kuku ppp
q    123  444  dff  pupu sds

我得到一个具有相同结构的新记录rec1(10列):

rec1 <-  col1 col2 col3 col4 col5 col6 ......
         a    22   13   dd   kuku ppp

如果我找到了这行,我想搜索df并返回true / false。 请告知如何做到这一点? Dplyr过滤器?

2 个答案:

答案 0 :(得分:4)

$conditions = [];

// Start by processing the user input into a data structure that can be used to construct the query

if (!empty($t)) {
    $conditions[] = [
        ['job_title', 'LIKE', '%' . $t . '%'],

    ];

}

if (!empty($l)) {
    $conditions[] = [
        ['location', '=', $l],
    ];
}

if (!empty($s)) {
    $conditions[] = [
        ['salary', '>=', $s],
    ];
}

// Loop the conditions and process them into valid SQL strings

$bindValues = [];
$whereClauseParts = [];

foreach ($conditions as $conditionSet) {
    $set = [];

    foreach ($conditionSet as $condition) {
        list($fieldName, $operator, $value) = $condition;

        $set[] = "`{$fieldName}` {$operator} :{$fieldName}";
        $bindValues[$fieldName] = $value;
    }

    $whereClauseParts[] = implode(' OR ', $set);
}

$statement = "SELECT * FROM 001_jobs_table_as  WHERE visiblity = 2";

if (!empty($whereClauseParts)) {
    $statement .= " AND (" . implode(') AND (', $whereClauseParts) . ")";
}


    /* Pagination Code starts */
    $per_page_html = '';
    $page = 1;
    $start=0;
    if(!empty($_GET["page"])) {
        $page = $_GET["page"];
        $start=($page-1) * ROW_PER_PAGE;
    }


    $limit=" limit " . $start . "," . ROW_PER_PAGE;
    $pagination_statement = $dbh->prepare($statement);
    $pagination_statement->execute($bindValues);


$row_count = $pagination_statement->rowCount();
if(!empty($row_count)){
    $per_page_html .= "<div class='page_row_selector'>";
    $page_count=ceil($row_count/ROW_PER_PAGE);
    if($page_count>1) {
        for($i=1;$i<=$page_count;$i++){
            if($i==$page){
                $per_page_html .= '<input type="submit" name="page" value="' . $i . '" class="btn-page active_page" />';
            } else {
                $per_page_html .= '<input type="submit" name="page" value="' . $i . '" class="btn-page" />';
            }
        }
    }
    $per_page_html .= "</div>";
}

    $query = $statement.$limit;
    $pdo_statement = $dbh->prepare($query);
    $pdo_statement->execute($bindValues);
    $result = $pdo_statement->fetchAll();


if(empty($result)) {  ?>

<div class="job_card">

<h1 class="display-5 text-center no_result_message"> No match found. </h1>

</div>


<?php }else{ 


 foreach($result as $row) { 

 $user_id = $row['user_id'];
 $job_key = $row['id'];
 $job_title = $row['job_title'];
 $location = $row['location'];
 $job_description = $row['job_description'];
 $employment_type = $row['employment_type'];
 $salary = $row['salary'];
 $salary_type = $row['salary_type'];
 $currency = $row['currency'];
 $post_time = $row['post_time'];
 $user_id = $row['user_id'];

$to_time = time();
$from_time = strtotime($post_time);
$time_elapsed = $to_time - $from_time; 

$seconds = round(abs($time_elapsed));   
$minutes = round(abs($time_elapsed) / 60);    
$hours = round(abs($time_elapsed) / 3600);    
$days = round(abs($time_elapsed) / 86400);    
$weeks = round(abs($time_elapsed) / 604800);


// display job information in here. 


} ?>

选项1:使用apply查找与行中所有值匹配的行。

$statement = "SELECT * FROM 001_jobs_table_as jt";

$statement .= " LEFT JOIN 001_application_table_as at ON at.job_id = jt.jt_id";

$statement .= " RIGHT JOIN 001_user_table_as ut ON ut.id = at.applicant_id";

$statement .= " WHERE jt.visiblity = 2";

选项2:通过粘贴每行的所有列来创建索引,然后与之匹配。

# sample data
df = mtcars
my_row = mtcars[10,]

两者都返回any(apply(df,1,function(x) {all(x==my_row)})) 。希望这有帮助!

答案 1 :(得分:1)

一种方法是使用row.match包中的prodlim

!is.na(row.match(rec1, df))

使用 dplyr :: semi_join 进行一些解决方法。然后检查是否有超过0行。

require(dplyr)

nrow(semi_join(df, rec1)) > 0