根据不同列的值在列中搜索

时间:2017-06-26 09:06:17

标签: 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      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

假装结果是:

  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

有任何建议我该如何解决这个问题?

除了&#39; Resp&#39;专栏,我想创建一个新的(Black.Y),其中包含&#34; Year&#34;对应于&#34;值&#34;的最小值直到&#39;价值&#39;高于&#34;目标&#34;。

假装结果是:

  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

有任何建议我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

以下是基础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