Importing Data Files using purrr and stringr

21 minute read

Updated:

Motivation

It’s a well-known [tenet](https://en.wikipedia.org/wiki/Rule_of_three_(computer_programming) of computer programming that if you have to copy and paste code more than twice, you should write a function.

In my phthalates exposure project, I imported 21 text files for tidying and analysis. This is clearly a task well-suited for a function, but instead, I tediously copied and pasted code 21 times. Why? Honestly, I just didn’t have much experience writing functions and I was too eager to get data into R to actually sit down and figure out how to automate it.

I knew, though, that one day, I’d sit down and figure out how to write that function. Today was that day.

A few things to note:

  1. I’m working with two file types here, and neither one is in a common .csv format. I downloaded these files from NHANES, which plays nicely with SAS, but less nicely with R. Some of the raw data they provide is in .txt format and some of it is in the SAS-ready .xport format. I’m using the read.xport function in the foreign library to import both types, but the function can easily be extended to more common file types.
  2. The function below is specific to the situation, wherein the files are downloaded not only in .xport/.txt format, but they are named using the years first and survey type second. This led to error messages when I tried to save the imported dataframes using their original filenames (R doesn’t like objects named with numbers first), so I did some character re-shuffling using a few stringr functions. If your files are named more appropriately, you won’t need this feature.

Code

As mentioned above, we’ll need the foreign library to read the xport files. We’ll also need stringr for some of the naming manipulations we’ll be doing within the function.

library(tidyverse)
library(foreign)
library(stringr)

First, we create a vector of filenames from the data folder and check its length.

files = list.files("../data/phthalates")
files
##  [1] "2003_2004_DEMO_C.XPT"       "2003_2004_PHTHTE_C.XPT.txt"
##  [3] "2005_2006_DEMO_D.XPT"       "2005_2006_PHTHTE_D.XPT.txt"
##  [5] "2007_2008_DEMO_E.XPT"       "2007_2008_PHTHTE_E.XPT.txt"
##  [7] "2009_2010_DEMO_F.XPT"       "2009_2010_PHTHTE_F.XPT.txt"
##  [9] "2011_2012_DBQ_G.XPT.txt"    "2011_2012_DEMO_G.XPT.txt"  
## [11] "2011_2012_EPH_G.XPT.txt"    "2011_2012_PHTHTE_G.XPT.txt"
## [13] "2013_2014_DBQ_H.XPT.txt"    "2013_2014_DEMO_H.XPT.txt"  
## [15] "2013_2014_EPHPP_H.XPT.txt"  "2013_2014_PHTHTE_H.XPT.txt"
## [17] "2015_2016_ALB_CR_I.XPT.txt" "2015_2016_DBQ_I.XPT.txt"   
## [19] "2015_2016_DEMO_I.XPT.txt"   "2015_2016_EPHPP_I.XPT.txt" 
## [21] "2015_2016_PHTHTE_I.XPT.txt"
length(files)
## [1] 21

Next, we write a function that does the following:

  1. Reads in a vector of names and concatenates it with the folder path, resulting in a vector of file path names called y
  2. Reads in the dataset represented by filepath y
  3. Removes the file extensions from y, since we’ll want these strings to name our imported dataframes
  4. Extracts the years, which originally come first in our filenames vector - otherwise, R will throw errors when we try to access the dataframes
  5. Rearranges the strings so that the years are at the end
  6. Stores the imported datasets, assigning a name using the resulting string from steps 3-5.
mult_import = function(x){
  y = str_c("../data/phthalates/", x) 
  z = as.data.frame(read.xport(y))
  name_1 = str_replace_all(x, ".txt|.XPT", "")
  years = str_sub(x, 1, 9)
  name_2 = str_sub(name_1, 11, 20)
  new_name = str_c(name_2, years, sep = "_")
  assign(new_name, z, envir = .GlobalEnv)
}

Next, we use purrr to apply mult_import to our datafiles. And voila! We have 21 neat dataframes to work with. I’m only going to print 3 of them here (just to prove that it worked).

data_sets = map(files, mult_import)

DEMO_C_2003_2004
##     SEQN SDDSRVYR RIDSTATR RIDEXMON RIAGENDR RIDAGEYR RIDAGEMN RIDAGEEX RIDRETH1
## 1  21005        3        2        1        1       19      232      233        4
## 2  21006        3        2        2        2       16      203      205        4
## 3  21007        3        2        1        2       14      172      172        3
## 4  21008        3        2        2        1       17      208      209        4
## 5  21009        3        2        2        1       55      671      672        3
## 6  21010        3        2        2        2       52      633      634        3
## 7  21011        3        2        1        1        0        3        4        1
## 8  21012        3        2        2        1       63      765      766        4
## 9  21013        3        2        1        2       13      163      164        4
## 10 21014        3        2        2        1        3       42       42        4
## 11 21015        3        2        2        1       83     1006     1007        3
## 12 21016        3        2        1        1       13      165      166        4
## 13 21017        3        2        1        2       37      444      445        1
## 14 21018        3        2        2        2       33      404      405        4
## 15 21019        3        2        2        2       50      606      607        1
## 16 21020        3        2        1        2       55      666      667        4
## 17 21021        3        1       NA        2       72      864       NA        3
## 18 21022        3        2        1        2        2       32       32        1
## 19 21023        3        2        1        2       19      239      241        4
## 20 21024        3        2        2        1       14      178      179        3
## 21 21025        3        2        1        2       18      217      218        2
## 22 21026        3        2        1        1       16      195      196        4
##    RIDRETH2 DMQMILIT DMDBORN DMDCITZN DMDYRSUS DMDEDUC3 DMDEDUC2 DMDEDUC DMDSCHOL
## 1         2        2       1        1       NA       11       NA       1        1
## 2         2       NA       1        1       NA       11       NA       1        2
## 3         1       NA       1        1       NA        8       NA       1        1
## 4         2        2       1        1       NA       10       NA       1        1
## 5         1        2       1        1       NA       NA        3       2       NA
## 6         1        2       1        1       NA       NA        4       3       NA
## 7         3       NA       1        1       NA       NA       NA      NA       NA
## 8         2        2       1        1       NA       NA        3       2       NA
## 9         2       NA       1        1       NA        6       NA       1        1
## 10        2       NA       1        1       NA       NA       NA      NA       NA
## 11        1        1       1        1       NA       NA        4       3       NA
## 12        2       NA       1        1       NA        7       NA       1        1
## 13        3        2       2        2        2       NA        2       1       NA
## 14        2        2       1        1       NA       NA        3       2       NA
## 15        3        2       2        2        2       NA        1       1       NA
## 16        2        2       1        1       NA       NA        2       1       NA
## 17        1        2       3        2        8       NA        3       2       NA
## 18        3       NA       1        1       NA       NA       NA      NA       NA
## 19        2        2       1        1       NA       11       NA       1        3
## 20        1       NA       1        1       NA        7       NA       1        1
## 21        5        2       3        1        5       11       NA       1        1
## 22        2       NA       1        1       NA        9       NA       1        1
##    DMDMARTL DMDHHSIZ INDHHINC INDFMINC INDFMPIR RIDEXPRG DMDHRGND DMDHRAGE
## 1         5        2        6        6     2.44       NA        1       39
## 2         5        6        7        6     2.47        1        2       27
## 3         5        5       NA        6     1.60        2        1       39
## 4         5        7       11        7     2.75       NA        2       40
## 5         1        2        8        8     3.79       NA        1       55
## 6         6        3        6        4     1.24        2        1       54
## 7        NA        7       13       13       NA       NA        2       22
## 8         6        2        2        2     0.89       NA        1       63
## 9        NA        3        2        2     0.59        2        2       30
## 10       NA        7        4        4     0.63       NA        2       31
## 11        1        2        4        4     1.20       NA        2       82
## 12       NA        6       10       10     2.58       NA        2       30
## 13        6        2        4        1     0.21        2        1       22
## 14        1        6        8        8     2.06        2        1       36
## 15        1        7        4        1     0.16        2        2       30
## 16        1        2        6        6     2.48        2        1       60
## 17        2        1       NA       NA       NA       NA        2       72
## 18       NA        7        7        4     0.88       NA        1       32
## 19        5        5        4        1     0.00        2        2       48
## 20        5        3        9        9     3.51       NA        2       43
## 21        5        7        6        6     1.13        2        1       38
## 22        5        4        7        7     2.17       NA        2       32
##    DMDHRBRN DMDHREDU DMDHRMAR DMDHSEDU SIALANG SIAPROXY SIAINTRP FIALANG FIAPROXY
## 1         1        5        3       NA       1        2        2       1        2
## 2         1        2        5       NA       1        2        2       1        2
## 3         1        4       NA       NA       1        1        2       1        2
## 4         1        4        5       NA       1        2        2       1        2
## 5         1        3        1        4       1        2        2       1        2
## 6         1        1        6       NA       1        2        2       1        2
## 7         2        1        1        3       2        1        2       1        2
## 8         1        3        6       NA       1        2        2       1        2
## 9         1        4        3       NA       1        1        2       1        2
## 10        1        4        1        4       1        1        2       1        2
## 11        1        4        1        4       1        2        2       1        2
## 12        1        4        1        3       1        1        2       1        2
## 13        2        2        6       NA       2        2        2       1        2
## 14        1        1        1        3       1        2        2       1        2
## 15        2        2        1        1       2        2        2       2        2
## 16        1        4        1        2       1        2        2       1        2
## 17        3        3        2       NA       1        2        2      NA       NA
## 18        2        2        1        2       2        1        2       1        2
## 19        3        1        1        2       1        2        2       1        2
## 20        1        5        3       NA       1        1        2       1        2
## 21       NA       NA        1        4       1        2        2       2        2
## 22        1        3        1        3       1        2        2       1        2
##    FIAINTRP MIALANG MIAPROXY MIAINTRP AIALANG  WTINT2YR  WTMEC2YR SDMVPSU SDMVSTRA
## 1         2       1        2        2       1  5512.321  5824.782       2       39
## 2         2       1        2        2       1  5422.140  5564.040       1       41
## 3         2       1        2        2       1 39764.177 40591.066       2       35
## 4         2       1        2        2       1  5599.499  5696.751       1       32
## 5         2       1        2        2       1 97593.679 97731.727       2       31
## 6         2       1        2        2       1 39599.363 43286.576       1       29
## 7         2      NA       NA       NA      NA  1647.618  1692.168       2       40
## 8         2      NA       NA       NA      NA 12629.440 12947.338       2       33
## 9         2       1        2        2       1  7174.371  7304.946       1       37
## 10        2      NA       NA       NA      NA  7498.031  8385.246       1       33
## 11        2       1        2        2      NA 17625.876 19994.160       2       33
## 12        2       1        2        2       1  7689.833  7832.795       2       36
## 13        2       2        2        2       2 26619.834 26802.589       2       42
## 14        2       1        2        2       1 34998.530 36208.263       2       33
## 15        2       2        2        2       2 14746.454 15876.719       1       41
## 16        2       1        2        2       1 28232.100 29102.084       1       38
## 17       NA      NA       NA       NA      NA 46999.264     0.000       2       39
## 18        2      NA       NA       NA      NA  6359.287  6329.696       1       39
## 19        2       1        2        2       1  5709.033  6114.820       1       35
## 20        2       1        2        2       1 38125.946 40061.772       2       33
## 21        2       1        2        2       1 13493.831 13772.570       2       43
## 22        2       1        2        2       1  5816.415  5924.548       1       37
##  [ reached 'max' / getOption("max.print") -- omitted 10100 rows ]
DBQ_G_2011_2012
##     SEQN DBQ010 DBD030 DBD041 DBD050 DBD055 DBD061 DBQ073A DBQ073B DBQ073C DBQ073D
## 1  62161     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
## 2  62162      1    121      1    365    243    365      10      NA      NA      NA
## 3  62163     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
## 4  62164     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
## 5  62165     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
## 6  62166     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
## 7  62167      1    182    182      0    212      0      NA      NA      NA      NA
## 8  62168      1    182    182    730    121    730      10      NA      NA      NA
## 9  62169     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
## 10 62170     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
## 11 62171     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
## 12 62172     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
## 13 62173      1    365      1    365    212    365      10      NA      NA      NA
## 14 62174     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
## 15 62175      1    243    243    365    273    365      10      NA      NA      NA
## 16 62176     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
## 17 62177     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
## 18 62178     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
## 19 62179     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
## 20 62180     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
## 21 62181     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
## 22 62182     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA
## 23 62183      1    364      0     NA    182    365      NA      NA      NA      NA
##    DBQ073E DBQ073U DBQ700 DBQ197 DBQ223A DBQ223B DBQ223C DBQ223D DBQ223E DBQ223U
## 1       NA      NA      2      3      NA      NA      NA      13      NA      NA
## 2       NA      NA     NA      3      10      NA      NA      NA      NA      NA
## 3       NA      NA     NA      3      NA      NA      NA      13      NA      NA
## 4       NA      NA      1      0      NA      NA      NA      NA      NA      NA
## 5       NA      NA     NA      3      10      NA      NA      NA      NA      NA
## 6       NA      NA     NA      3      NA      NA      12      NA      NA      NA
## 7       NA      NA     NA     NA      NA      NA      NA      NA      NA      NA
## 8       NA      NA     NA      3      NA      11      NA      NA      NA      NA
## 9       NA      NA      3      1      NA      11      NA      NA      NA      NA
## 10      NA      NA     NA      3      NA      11      NA      NA      NA      NA
## 11      NA      NA     NA      3      10      NA      NA      NA      NA      NA
## 12      NA      NA      3      3      NA      11      NA      NA      NA      NA
## 13      NA      NA     NA      3      NA      11      NA      NA      NA      NA
## 14      NA      NA      2      2      NA      11      NA      NA      NA      NA
## 15      NA      NA     NA      3      10      NA      NA      NA      NA      NA
## 16      NA      NA      2      3      NA      NA      NA      13      NA      NA
## 17      NA      NA      3      2      NA      11      NA      NA      NA      NA
## 18      NA      NA      4      3      NA      11      NA      NA      NA      NA
## 19      NA      NA      3      0      NA      NA      NA      NA      NA      NA
## 20      NA      NA      4      3      NA      NA      NA      NA      NA      30
## 21      NA      NA     NA      3      10      11      NA      NA      NA      NA
## 22      NA      NA      2      1      NA      NA      NA      13      NA      NA
## 23      14      NA     NA      3      NA      11      NA      NA      NA      NA
##    DBQ229 DBQ235A DBQ235B DBQ235C DBQ301 DBQ330 DBQ360 DBQ370 DBD381 DBQ390 DBQ400
## 1       1       3       3       3     NA     NA     NA     NA     NA     NA     NA
## 2      NA      NA      NA      NA     NA     NA     NA     NA     NA     NA     NA
## 3      NA      NA      NA      NA     NA     NA      1      1      5      3      1
## 4       2      NA      NA      NA     NA     NA     NA     NA     NA     NA     NA
## 5      NA      NA      NA      NA     NA     NA      1      1      5      1      1
## 6      NA      NA      NA      NA     NA     NA      1      1      5      3      2
## 7      NA      NA      NA      NA     NA     NA     NA     NA     NA     NA     NA
## 8      NA      NA      NA      NA     NA     NA      1      1      1      3      1
## 9       3       2       3       1     NA     NA     NA     NA     NA     NA     NA
## 10     NA      NA      NA      NA     NA     NA      1      1      5      3      2
## 11     NA      NA      NA      NA     NA     NA      1      1      4      2      1
## 12      1       3       3       3     NA     NA     NA     NA     NA     NA     NA
## 13     NA      NA      NA      NA     NA     NA     NA     NA     NA     NA     NA
## 14      1       3       3       3      2      2     NA     NA     NA     NA     NA
## 15     NA      NA      NA      NA     NA     NA      1      1      5      1      1
## 16      1       3       3       3     NA     NA     NA     NA     NA     NA     NA
## 17      2      NA      NA      NA     NA     NA     NA     NA     NA     NA     NA
## 18      1       3       3       3      1      2     NA     NA     NA     NA     NA
## 19      3       3       3       2     NA     NA     NA     NA     NA     NA     NA
## 20      1       3       3       3     NA     NA     NA     NA     NA     NA     NA
## 21     NA      NA      NA      NA     NA     NA      1      1      5      1      1
## 22      3       3       3       1      2      2     NA     NA     NA     NA     NA
## 23     NA      NA      NA      NA     NA     NA      1      1      5      3      1
##    DBD411 DBQ421 DBQ424 DBD895 DBD900 DBD905 DBD910 CBQ595 CBQ600 CBQ605 CBQ610
## 1      NA     NA     NA      2      2      0      0      2      2     NA     NA
## 2      NA     NA     NA      0     NA      0      1     NA     NA     NA     NA
## 3       0     NA     NA      0     NA      0      2     NA     NA     NA     NA
## 4      NA     NA     NA      3      0      0      0      1     NA      2      2
## 5       5      1      3      2      2      5      3     NA     NA     NA     NA
## 6      NA     NA     NA      1      0      2      2     NA     NA     NA     NA
## 7      NA     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA
## 8       0     NA     NA      2      1      0      8     NA     NA     NA     NA
## 9      NA     NA     NA      7      7      0      1      2      2     NA     NA
## 10     NA     NA     NA      0     NA      0      0     NA     NA     NA     NA
## 11      1      1      3      3      3      4      0     NA     NA     NA     NA
## 12     NA     NA     NA      5      5      0      0      2      1     NA      2
## 13     NA     NA     NA      0     NA      0      0     NA     NA     NA     NA
## 14     NA     NA     NA      0     NA      1      1      2      1     NA      1
## 15      0     NA      3      2      1     30     30     NA     NA     NA     NA
## 16     NA     NA     NA      3      1      0      1      2      1     NA      2
## 17     NA     NA     NA      0     NA      0      0      2      2     NA     NA
## 18     NA     NA     NA      1      0      6     17      2      2     NA     NA
## 19     NA     NA     NA      3      0      2      0      2      1     NA      2
## 20     NA     NA     NA      8      4      0      4      1     NA      2      2
## 21      0     NA      3      1      1      0      0     NA     NA     NA     NA
## 22     NA     NA     NA      2      0      1      1      1     NA      2      2
## 23      5      3     NA      1      1      5      0     NA     NA     NA     NA
##  [ reached 'max' / getOption("max.print") -- omitted 9733 rows ]
PHTHTE_C_2003_2004
##     SEQN    WTSB2YR URXMBP URDMBPLC URXMCP URDMCPLC   URXMEP URDMEPLC URXMHP
## 1  21006  15983.728  375.6        0 0.2843        1  221.232        0    3.2
## 2  21013  20984.800   86.7        0 0.2843        1  306.702        0   33.8
## 3  21015  64191.400   12.6        0 0.2843        1  154.110        0    0.6
## 4  21016  23989.437   62.7        0 1.2060        0  132.528        0   10.6
## 5  21023  17565.945  206.1        0 0.2843        1  199.716        0   21.7
## 6  21026  18145.065  135.8        0 0.2843        1  108.966        0    2.5
## 7  21027  36738.941   28.4        0 0.2843        1   90.750        0    2.6
## 8  21031 263724.086    8.7        0 0.2843        1   16.434        0    0.6
## 9  21033  82316.528   32.9        0 0.2843        1  604.230        0    1.3
## 10 21036  71447.158    4.4        0 0.2843        1    7.524        0    0.6
## 11 21037  65800.789   39.9        0 0.2843        1  216.942        0   20.0
## 12 21038  21609.425   11.9        0 0.2843        1   30.558        0    1.0
## 13 21039  59483.964   17.5        0 0.2843        1   63.954        0    1.4
## 14 21041   9929.473   20.2        0 0.2843        1  142.494        0   15.6
## 15 21045 143827.869   21.1        0 0.2843        1  369.930        0    1.5
## 16 21047  19972.693    9.7        0 0.2843        1   57.420        0    2.3
## 17 21057 108477.791   22.6        0 0.2843        1   93.390        0   95.7
## 18 21064  34942.731   49.5        0 0.8040        0   64.350        0    7.5
## 19 21066      0.000     NA       NA     NA       NA       NA       NA     NA
## 20 21068 143113.714   10.0        0 0.2843        1   14.256        0    0.6
## 21 21083  16978.037   34.4        0 0.2843        1   83.094        0    1.5
## 22 21084 279483.714   13.0        0 0.2843        1   19.008        0    0.6
## 23 21086  85456.720   17.3        0 0.2843        1   12.936        0    1.3
## 24 21087 121948.671   11.9        0 0.2843        1  344.850        0    1.0
## 25 21090  55912.651  102.1        0 0.2843        1  380.094        0    4.0
## 26 21094  27317.087   71.4        0 0.2843        1   50.358        0    4.8
## 27 21095  14642.227    7.7        0 0.2843        1  124.146        0    0.6
## 28 21098  23448.273   27.8        0 0.2843        1  101.640        0    2.3
## 29 21100  91017.017    9.5        0 0.2843        1  152.724        0    0.6
## 30 21101  36738.941   46.4        0 0.2843        1  142.164        0    2.1
## 31 21104  41615.836    5.5        0 0.2843        1 1370.094        0    0.6
## 32 21107 197655.715   29.9        0 0.2843        1   93.720        0    0.6
## 33 21119 146985.242   34.1        0 1.2060        0   54.714        0   17.5
## 34 21124  66504.682   29.7        0 0.2843        1   26.994        0    1.7
##    URDMHPLC URXMNP URDMNPLC URXMOP URDMOPLC URXMZP URDMZPLC URXMNM URDMNMLC URXMC1
## 1         0 1.0889        1 1.1879        1 17.784        0    5.4        0    4.1
## 2         0 1.0889        1 1.1879        1 40.464        0   23.8        0    7.9
## 3         1 1.0889        1 1.1879        1  2.880        0    3.6        0    2.0
## 4         0 1.0889        1 1.1879        1 49.392        0    8.0        0    6.1
## 5         0 1.0889        1 1.1879        1 15.984        0    3.2        0    7.6
## 6         0 1.0889        1 1.1879        1  9.720        0    5.6        0    4.6
## 7         0 1.0889        1 1.1879        1 23.976        0    0.7        1    9.0
## 8         1 1.0889        1 1.1879        1  1.728        0    1.3        0    1.0
## 9         0 1.0889        1 1.1879        1  5.976        0    3.9        0    2.4
## 10        1 1.0889        1 1.1879        1  0.504        0    0.7        1    0.3
## 11        0 1.0889        1 1.1879        1 22.248        0    2.6        0    4.2
## 12        0 1.0889        1 1.1879        1  9.648        0    0.7        1    1.9
## 13        0 1.0889        1 1.1879        1  2.736        0    4.1        0    3.7
## 14        0 1.0889        1 1.1879        1 17.352        0    0.7        1    5.1
## 15        0 1.0889        1 1.1879        1 13.824        0    1.4        0    3.2
## 16        0 1.0889        1 1.1879        1  5.184        0    0.7        1    2.4
## 17        0 1.0889        1 1.1879        1 12.600        0    3.9        0    2.3
## 18        0 1.0889        1 1.1879        1 71.352        0    1.1        0   17.2
## 19       NA     NA       NA     NA       NA     NA       NA     NA       NA     NA
## 20        1 1.0889        1 1.1879        1  5.256        0   17.0        0    0.8
## 21        0 1.0889        1 1.1879        1 27.216        0    0.7        1    7.2
## 22        1 1.0889        1 1.1879        1  3.960        0    0.7        1    1.3
## 23        0 1.0889        1 1.1879        1  5.400        0    0.7        1    2.3
## 24        0 1.0889        1 1.1879        1  9.432        0    1.8        0    5.0
## 25        0 1.0889        1 1.1879        1 17.352        0   13.4        0    4.5
## 26        0 1.0889        1 1.1879        1 24.984        0    0.7        1    2.7
## 27        1 1.0889        1 1.1879        1  1.944        0    0.7        1    1.5
## 28        0 1.0889        1 1.1879        1 26.280        0   57.2        0    4.1
## 29        1 1.0889        1 1.1879        1  1.944        0    1.8        0    0.5
## 30        0 1.0889        1 1.1879        1 39.672        0    5.8        0   13.9
## 31        1 1.0889        1 1.1879        1  5.472        0    0.7        1    1.5
## 32        1 1.0889        1 1.1879        1 19.584        0    4.2        0    2.4
## 33        0 4.9280        0 1.1879        1 12.240        0    0.7        1    8.3
## 34        0 1.0889        1 1.1879        1 20.736        0    1.0        0    4.8
##    URDMC1LC URXMHH URDMHHLC URXMOH URDMOHLC URXMIB URDMIBLC URXECP URDECPLC URXUCR
## 1         0   21.7        0   16.9        0   52.8        0   22.8        0    289
## 2         0  351.7        0  210.5        0   47.4        0  472.8        0    302
## 3         0    9.1        0    7.4        0    3.4        0   13.6        0     98
## 4         0   57.8        0   33.9        0   21.7        0   48.3        0    200
## 5         0  176.4        0  115.8        0   22.4        0  257.2        0    213
## 6         0   71.7        0   44.0        0    5.1        0   87.9        0    185
## 7         0   24.1        0   14.8        0   11.3        0   27.8        0    107
## 8         0   10.2        0    7.1        0    1.8        0   10.3        0     60
## 9         0   18.8        0   11.1        0    4.6        0   46.9        0    270
## 10        0    1.2        0    0.7        0    0.2        1    4.8        0     14
## 11        0  115.2        0   90.1        0    3.3        0  235.5        0    175
## 12        0   11.6        0    8.5        0    2.4        0   18.0        0    141
## 13        0   14.0        0   11.4        0    1.3        0   18.9        0    108
## 14        0   61.5        0   36.0        0   11.7        0  116.7        0    113
## 15        0   21.7        0   14.1        0    4.6        0   24.8        0     94
## 16        0   24.2        0   14.7        0    6.0        0   38.6        0     80
## 17        0  530.0        0  325.5        0    2.4        0  472.1        0    122
## 18        0   85.6        0   63.6        0   11.3        0  174.8        0    189
## 19       NA     NA       NA     NA       NA     NA       NA     NA       NA     28
## 20        0    6.1        0    4.2        0    2.9        0    6.6        0    103
## 21        0   21.8        0   13.3        0    2.5        0   48.4        0     88
## 22        0    5.2        0    2.9        0    1.0        0   15.0        0     41
## 23        0   20.7        0   12.0        0    5.5        0   29.5        0    119
## 24        0   20.6        0   13.8        0    2.8        0   38.8        0    157
## 25        0   50.8        0   30.7        0    6.8        0   56.6        0    259
## 26        0   67.2        0   39.1        0    8.0        0   87.5        0    137
## 27        0    3.5        0    2.7        0    1.3        0   10.8        0     72
## 28        0   32.4        0   23.6        0    5.3        0   64.4        0    112
## 29        0   37.4        0   29.6        0    0.2        1   62.0        0     70
## 30        0   25.3        0   18.8        0   16.3        0   45.7        0    101
## 31        0    6.1        0    3.4        0    3.6        0    8.6        0     72
## 32        0   13.0        0    8.3        0    5.5        0   22.7        0    155
## 33        0  286.2        0  214.7        0   11.3        0  397.2        0    135
## 34        0   24.7        0   16.6        0   38.9        0   27.1        0    328
##  [ reached 'max' / getOption("max.print") -- omitted 2663 rows ]

Conclusion

Writing these 10 lines definitely took me about 5 hours and a lot of debugging. Quite frankly, it would have taken me about 10 minutes to just copy and paste slightly modified version of the same code 21 times. But then I wouldn’t have had the experience of the happy dance that resulted from the function running.

And I guess this is really a testament to the process of automation, which usually follows the so-called flywheel effect. It takes a lot of effort to get the thing spinning, but once it picks up enough momentum, you get tons of movement with minimal addition effort.