2017-06-26 54 views
3

我有一個包含三列(「年」,「目標」,「值」)的簡單表格,我想創建一個新列(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 

任何建議,我怎麼能解決這個問題?

除了'Resp'列之外,我還想創建一個包含對應於「Value」最小值的「Year」的新對象(Black.Y),直到'Value'高於'Target'。

這個假的結果是:

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 

任何建議,我怎麼能解決這個問題?

回答

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

謝謝您的回答。它完美的作品。 – KinSF

相關問題