gtools: Useful Data Manipulation Functions
I recently came across package gtools that contains various R programming tools for data manipulation. This post highlights some of the functions contained in this package which I found most useful for data manipulation. Some of the examples are from gtools’ help pages.
mixedsort() / mixedorder()
This function sorts or orders character strings containing numbers so that the numbers are numerically sorted rather than sorted by character value.
> library(gtools) > desc <- paste("A", 1:12, sep = "") > sort(desc) [1] "A1" "A10" "A11" "A12" "A2" "A3" "A4" "A5" [9] "A6" "A7" "A8" "A9" > mixedsort(desc) [1] "A1" "A2" "A3" "A4" "A5" "A6" "A7" "A8" [9] "A9" "A10" "A11" "A12" |
smartbind()
Efficiently combines data frames, even if the column names don’t match.
> df1 <- data.frame(A = 1:10, B = LETTERS[1:10], C = rnorm(10)) > df2 <- data.frame(A = 11:20, D = rnorm(10), E = letters[1:10]) |
smartbind() combines them, appropriately creating NA entries.
> smartbind(df1, df2) A B C D E 1.1 1 A -0.2783511 NA <NA> 1.2 2 B 0.1885082 NA <NA> 1.3 3 C 0.2403823 NA <NA> 1.4 4 D 0.9866348 NA <NA> 1.5 5 E -0.2204937 NA <NA> 1.6 6 F -2.2177263 NA <NA> 1.7 7 G 1.5494367 NA <NA> 1.8 8 H 1.2159574 NA <NA> 1.9 9 I 0.9482660 NA <NA> 1.10 10 J -1.5123528 NA <NA> 2.1 11 <NA> NA -1.9943360 a 2.2 12 <NA> NA -1.3132422 b 2.3 13 <NA> NA 0.6771895 c 2.4 14 <NA> NA -0.8470251 d 2.5 15 <NA> NA 0.7926469 e 2.6 16 <NA> NA -1.5133757 f 2.7 17 <NA> NA -1.7590515 g 2.8 18 <NA> NA -2.6861958 h 2.9 19 <NA> NA -0.5772023 i 2.10 20 <NA> NA 0.8225223 j |
running()
This function applies a function over subsets of the vector(s) formed by taking a fixed number of previous points. It is very handy, for example, in calculating moving averages over a period specified by width.
> df <- data.frame(a = sample(10)) > df$b <- running(df$a, width = 2, pad = TRUE, fun = mean) |
> df a b 1 2 NA 2 8 5.0 3 5 6.5 4 3 4.0 5 9 6.0 6 1 5.0 7 6 3.5 8 10 8.0 9 7 8.5 10 4 5.5 |
Many thanks for blogging about this… just what I was looking for!