Selectively replacing columns in R with their delta values <p>I've got data being read into a data frame R, by column. Some of the columns will increase in value; for those columns only, I want to replace each value (n) with its difference from the previous value in that column. For example, looking at an individual column, I want</p> <pre><code>c(1,2,5,7,8) </code></pre> <p>to be replaced by</p> <pre><code>c(1,3,2,1) </code></pre> <p>which are the differences between successive elements</p> <p>However, it's getting really late in the day, and I think my brain has just stopped working. Here's my code at present</p> <pre><code>col1 &lt;- c(1,2,3,4,NA,2,3,1) # This column rises and falls, so we want to ignore it col2 &lt;- c(1,2,3,5,NA,5,6,7) # Note: this column always rises in value, so we want to replace it with deltas col3 &lt;- c(5,4,6,7,NA,9,3,5) # This column rises and falls, so we want to ignore it d &lt;- cbind(col1, col2, col3) d fix_data &lt;- function(data) { # Iterate through each column... for (column in data[,1:dim(data)[2]]) { lastvalue &lt;- 0 # Now walk through each value in the column, # checking to see if the column consistently rises in value for (value in column) { if (is.na(value) == FALSE) { # Need to ignore NAs if (value &gt;= lastvalue) { alwaysIncrementing &lt;- TRUE } else { alwaysIncrementing &lt;- FALSE break } } } if (alwaysIncrementing) { print(paste("Column", column, "always increments")) } # If a column is always incrementing, alwaysIncrementing will now be TRUE # In this case, I want to replace each element in the column with the delta between successive # elements. The size of the column shrinks by 1 in doing this, so just prepend a copy of # the 1st element to the start of the list to ensure the column length remains the same if (alwaysIncrementing) { print(paste("This is an incrementing column:", colnames(column))) column &lt;- c(column[1], diff(column, lag=1)) } } data } fix_data(d) d </code></pre> <p>If you copy/paste this code into RGui, you'll see that it doesn't do anything to the supplied data frame.</p> <p>Besides losing my mind, what am I doing wrong??</p> <p>Thanks in advance</p>