Home > OS >  R: How to compare values in a column with later values in the same column
R: How to compare values in a column with later values in the same column

Time:12-10

I am attempting to work with a large dataset in R where I need to create a column that compares the value in an existing column to all values that follow it (ex: row 1 needs to compare rows 1-10,000, row 2 needs to compare rows 2-10,000, row 3 needs to compare rows 3-10,000, etc.), but cannot figure out how to write the range.

I currently have a column of raw numeric values and a column of row values generated by:

samples$row = seq.int(nrow(samples))

I have attempted to generate the column with the following command:

samples$processed = min(samples$raw[samples$row:10000])

but get the error "numerical expression has 10000 elements: only the first used" and the generated column only has the value for row 1 repeated for each of the 10,000 rows.

How do I need to write this command so that the lower bound of the range is the row currently being calculated instead of 1?

Any help would be appreciated, as I have minimal programming experience.

CodePudding user response:

If all you need is the min of the specific row and all following rows, then

rev(cummin(rev(samples$val)))
#  [1]  24  24  24  24  24  24  24  24  24  24  24  24 165 165 165 165 410 410 410 882

If you have some other function that doesn't have a cumulative variant (and your use of min is just a placeholder), then one of:

mapply(function(a, b) min(samples$val[a:b]), seq.int(nrow(samples)), nrow(samples))
#  [1]  24  24  24  24  24  24  24  24  24  24  24  24 165 165 165 165 410 410 410 882

sapply(seq.int(nrow(samples)), function(a) min(samples$val[a:nrow(samples)]))

The only reason to use mapply over sapply is if, for some reason, you want window-like operations instead of always going to the bottom of the frame. (Though if you wanted windows, I'd suggest either the zoo or slider packages.)


Data

set.seed(42)
samples <- data.frame(val = sample(1000, size=20))
samples
#    val
# 1  561
# 2  997
# 3  321
# 4  153
# 5   74
# 6  228
# 7  146
# 8  634
# 9   49
# 10 128
# 11 303
# 12  24
# 13 839
# 14 356
# 15 601
# 16 165
# 17 622
# 18 532
# 19 410
# 20 882
  •  Tags:  
  • r
  • Related