-
Notifications
You must be signed in to change notification settings - Fork 3
/
orderedWords.R
72 lines (61 loc) · 1.23 KB
/
orderedWords.R
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
if(FALSE) {
z = readRDS("words.rds")
source("orderedWords.R")
tm1 = system.time(x <- mkCol1(z))
tm2 = system.time(y <- mkCol2(z))
stopifnot(identical(x, y))
}
mkCol1 =
#
# One call to paste, but swap the pairse where z[,1] >= z[,2]
#
function(z)
{
# Make a new copy of z so we can swap some of the pairs row-wise
tmp = z[, c("a", "b")]
w = z$a >= z$b
tmp2 = tmp$a[w]
tmp$a[w] = tmp$b[w]
tmp$b[w] = tmp2
z$c = paste(tmp$a, tmp$b, sep = "_")
z
}
mkCol2 =
#
# 2 calls to paste()
#
function(z)
{
w = z$a < z$b
z$c = ""
z$c[w] = paste(z$a[w], z$b[w], sep = "_")
z$c[!w] = paste(z$b[!w], z$a[!w], sep = "_")
z
}
mkCol3 =
# non-vectorized version
function(z)
{
z$c = apply(z, 1, function(x) paste(x[order(x)], collapse = "_"))
z
}
mkCol4 =
# also non-vectorized
function(z)
{
tmp = apply(z, 1, function(x) x[order(x)])
z$c = sprintf("%s_%s", tmp[1,], tmp[2,])
z
}
mkCol5 = slow =
function(z)
{
ans = character(nrow(z))
for(i in 1:nrow(z)) {
ans[i] = if(z[i, 1] < z[i, 2])
paste0(z[i,1], "_", z[i,2])
else
paste0(z[i,2], "_", z[i,1])
}
ans
}