R 基于其他列的值在列中搜索

R 基于其他列的值在列中搜索,r,dplyr,R,Dplyr,我有一个简单的表,有三列(“年”、“目标”、“值”),我想创建一个新的列(Resp),其中包含“年”,其中“值”高于“目标”。选择值(列“年”)对应于“值”第一次高于“目标”的时间 这是表格的一部分: 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

我有一个简单的表,有三列(“年”、“目标”、“值”),我想创建一个新的列(Resp),其中包含“年”,其中“值”高于“目标”。选择值(列“年”)对应于“值”第一次高于“目标”的时间

这是表格的一部分:

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
有什么建议可以解决这个问题吗

除了“Resp”列之外,我还想创建一个新的列(Black.Y),其中包含与“Value”的最小值相对应的“Year”,直到“Value”高于“Target”

假装的结果是:

  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
  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

有什么建议可以解决这个问题吗?

这里有一个base R中的方法:

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
#   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