/
repeat.cc
115 lines (91 loc) · 3.17 KB
/
repeat.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
//------------------------------------------------------------------------------
// Copyright 2018 H2O.ai
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
//------------------------------------------------------------------------------
#include "column/repeated.h"
#include "frame/py_frame.h"
#include "python/args.h"
#include "datatablemodule.h"
#include "rowindex.h"
namespace py {
//------------------------------------------------------------------------------
// datatable.repeat()
//------------------------------------------------------------------------------
static const char* doc_repeat =
R"(repeat(frame, n)
--
Concatenate `n` copies of the `frame` by rows and return the result.
This is equivalent to ``dt.rbind([frame] * n)``.
Example
-------
::
>>> from datatable import dt
>>> DT = dt.Frame({"A": [1, 1, 2, 1, 2],
... "B": [None, 2, 3, 4, 5]})
>>> DT
| A B
| int32 int32
-- + ----- -----
0 | 1 NA
1 | 1 2
2 | 2 3
3 | 1 4
4 | 2 5
[5 rows x 2 columns]
::
>>> dt.repeat(DT, 2)
| A B
| int32 int32
-- + ----- -----
0 | 1 NA
1 | 1 2
2 | 2 3
3 | 1 4
4 | 2 5
5 | 1 NA
6 | 1 2
7 | 2 3
8 | 1 4
9 | 2 5
[10 rows x 2 columns]
)";
static PKArgs args_repeat(
2, 0, 0, false, false, {"frame", "n"},
"repeat", doc_repeat);
static oobj repeat(const PKArgs& args) {
DataTable* dt = args[0].to_datatable();
size_t n = args[1].to_size_t();
// Empty Frame: repeating is a noop
if (dt->ncols() == 0 || dt->nrows() == 0) {
return Frame::oframe(new DataTable(*dt));
}
colvec newcols(dt->ncols());
for (size_t i = 0; i < dt->ncols(); ++i) {
newcols[i] = dt->get_column(i); // copy
newcols[i].repeat(n);
}
DataTable* newdt = new DataTable(std::move(newcols),
*dt); // copy names from dt
return Frame::oframe(newdt);
}
void DatatableModule::init_methods_repeat() {
ADD_FN(&repeat, args_repeat);
}
} // namespace py