使用sample()创建新的data.frame变量,最大sample()值按行不同

时间:2018-04-11 02:05:06

标签: r dataframe random iteration conditional-operator

我有一个12071行<!DOCTYPE html> <html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'> <head> <meta http-equiv='content-type' content='text/html;charset=utf-8' /> <meta name='viewport' content='width=device-width' /> <title>addTextAfterEvery</title> <link type='text/css' rel='stylesheet' href='external.css' /> <script type='text/javascript' src='external.js'></script> </head> <body> <div class='main'> <h1>My Day at the Park</h1> <p>I had a great day at the park today.</p> <p>It was very fun, and I would like to go again soon.</p> </div> </body> </html>的数据框。我正在尝试为foo的每一行生成基于1:K的单个随机值,并将其插入到新列L中。例如,第一行应该给出介于1之间的L值5,第二个应该给出1到9之间的值,第三个应该给出1到3之间的值,依此类推。这些值必须是整数,因此我尝试使用foo。每行内的任何整数都有相同的选择概率。

我已经减少了代码中的列数,因为它们无关紧要,而且我在示例中遇到数据包装问题。列A和K是链接的,因此列A中的字符串在列K中始终具有相同的值。由于列A值不唯一,因此存在重复的A / K组合。

数据(减少列数):

sample()

我无法让我的代码工作。对于data.frame中的每一行,我无法计算出将新的最大值传递给A B C D E F G ... K A011100 F 7 Partnered 4 40-49 Hrs 0.04075 5 A011200 M 7 Partnered 4 40-49 Hrs 0.13334 9 A011400 F 8 Non-partnered 2 30-39 Hrs 0.02310 3 A011500 F 4 Non-partnered 4 1-9 Hrs 0.94519 4 A012100 M 8 Partnered 4 40-49 Hrs 0.78114 4 的逻辑,并在每一行中正确构造它。

我尝试了以下内容:

sample()

这给了:

  

match.fun(FUN)出错:       'sample(1:foo $ K,1)'不是函数,字符或符号       另外:警告信息:       在1:foo $ K:       数值表达式有12071个元素:只使用第一个

然后

foo$L <- lapply(foo, sample(1:foo$K,1))

并且错误来自:

  

foo$L <- lapply(foo, function(x) sample(1:foo$K,1)) 中的错误($<-.data.frame,L,值=列表(A = 1L,:       更换有12行,数据有12071       另外:有12个警告(使用警告()来查看它们)

然后

*tmp*

那给了

  

有50个或更多警告(使用警告()查看前50个

2 个答案:

答案 0 :(得分:3)

我们可以使用sample

进行sapply
df$L <- sapply(df$K, function(x) sample(x, 1))

#        A B C K L
#1 A011100 F 7 5 1
#2 A011200 M 7 9 7
#3 A011400 F 8 3 2
#4 A011500 F 4 4 2
#5 A012100 M 8 4 1

取自?sample

  

如果x的长度为1,则为数字(在is.numeric意义上),x> = 1,则样本采样从1:x开始。

因此,对于df$K的每个值,我们会从1:x中的sapply对其进行抽样,然后随机选择其中一个值。

PS - 为了简化和提高可视性,我进一步减少了列。

答案 1 :(得分:2)

我认为Ronak Shah的答案比我的好,但对于A B C D E F G K L A011100 F 7 Partnered 4 40-49 Hrs 0.04075 5 4 A011200 M 7 Partnered 4 40-49 Hrs 0.13334 9 7 A011400 F 8 Non-partnered 2 30-39 Hrs 0.02310 3 1 A011500 F 4 Non-partnered 4 1-9 Hrs 0.94519 4 3 A012100 M 8 Partnered 4 40-49 Hrs 0.78114 4 1 解决方案,请尝试:

<?php
    include('session.php');

    $name=$_POST['name'];
    $category=$_POST['category'];
    $price=$_POST['price'];
    $supplier=$_POST['supplier'];
    $qty=$_POST['qty'];


    if($qty == 0){
echo "<script language='JavaScript'>
window.alert('Quantity cannot be 0')
window.location.href='product.php';</script>";
exit;
}

    if($price == 0){
echo "<script language='JavaScript'>
window.alert('Price cannot be 0')
window.location.href='product.php';</script>";
exit;
}
    $fileInfo = PATHINFO($_FILES["image"]["name"]);

    if (empty($_FILES["image"]["name"])){
        $location="";
    }
    else{
        if ($fileInfo['extension'] == "jpg" OR $fileInfo['extension'] == "png") {
            $newFilename = $fileInfo['filename'] . "_" . time() . "." . $fileInfo['extension'];
            move_uploaded_file($_FILES["image"]["tmp_name"], "../upload/" . $newFilename);
            $location = "upload/" . $newFilename;
        }




        else{
            $location="";
            ?>
                <script>
                    window.alert('Photo not added. Please upload JPG or PNG photo only!');
                </script>
            <?php
        }
    }

    mysqli_query($conn,"insert into product (product_name,categoryid,product_price,product_qty,photo, supplierid) values ('$name','$category','$price','$qty','$location', '$supplier')");
    $pid=mysqli_insert_id($conn);

    mysqli_query($conn,"insert into inventory (userid, action, productid, quantity, inventory_date) values ('".$_SESSION['id']."', 'Add Product', '$pid', '$qty', NOW())");

    ?>
        <script>
            window.alert('Product added successfully!');
            window.history.back();
        </script>
    <?php
?>

输出:

SELECT     
   t1.*, (select t2.Category from Table2 as t2 where t2.ticket_id = t1.ticket_id limit 1) as Category
FROM       
   Table1 as t1