Search in a column based on the value of another column

I have a simple table with three columns ("Year", "Target", "Value") and I would like to create a new column (Resp) containing "Year" where "Value" is higher than "Target". The selection value (Year column) matches the first Value above Target.

This is part of the table:

db <- data.frame(Year=2010:2017, Target=c(3,5,2,7,5,8,3,6), Value=c(4,5,2,7,4,9,5,8)).
print(db)
   Yea Target Value
1 2010      3     4
2 2011      5     5
3 2012      2     2
4 2013      7     3
5 2014      5     4
6 2015      8     9
7 2016      3     5
8 2017      6     8

      

Fake result:

  Year Target Value Resp
1 2010      3     4 2011
2 2011      5     5 2015
3 2012      2     2 2013
4 2013      7     3 2015
5 2014      5     4 2015
6 2015      8     9   NA
7 2016      3     5 2017
8 2017      6     8   NA

      

Any suggestion how I can solve this problem?

In addition to the "Resp" column, I want to create a new (Black.Y) containing "Year" corresponding to the minimum "Value" until the "Value" is greater than "Target".

Fake result:

  Year Target Value Resp Black.Y
1 2010      3     4 2011 NA
2 2011      5     5 2015 2012
3 2012      2     2 2013 NA
4 2013      7     3 2015 2014
5 2014      5     4 2015 NA
6 2015      8     9   NA 2016
7 2016      3     5 2017 NA
8 2017      6     8   NA NA

      

Any suggestion how I can solve this problem?

+3


source to share


1 answer


Here's the R base approach:

o <- outer(db$Target, db$Value, `<`)      # compute a logical matrix
o[lower.tri(o, diag = TRUE)] <- FALSE     # replace lower.tri and diag with FALSE
idx <- max.col(o, ties.method = "first")  # get the index of the first maximum
idx <- replace(idx, rowSums(o) == 0, NA)  # take care of cases without greater Value
db$Resp <- db$Year[idx]                   # add new column

      



Summary table:

#   Year Target Value Resp
# 1 2010      3     4 2011
# 2 2011      5     5 2013
# 3 2012      2     2 2013
# 4 2013      7     7 2015
# 5 2014      5     4 2015
# 6 2015      8     9   NA
# 7 2016      3     5 2017
# 8 2017      6     8   NA

      

+2


source







All Articles