我正在尝试创建一个函数来找出数据框中某列的行之间某些数字匹配的位置:
数据:
df = data.frame("one"=c(1,2,3,4,5,6,7),"two"=c(8,9,10,11,12,13,14))
尝试:
fun_match_one <- function(value_to_match, data) {
if(value_to_match<data$one[1]) {row=1}
else {
row=which((value_to_match>=data$one) == (value_to_match<c(tail(data$one,-1),Inf)))
}
return(row)
}
例如, value_to_match = 6.5介于6和7之间,因此我们得到了6所在行的匹配项。我只是觉得我的解决方案太丑陋了,希望有人可以帮助使它更加优雅。
编辑:目前不使用df的第二列。
EDIT2 :如果value_to_match低于列的最小值,是列的最小值,则期望的输出;如果value_to_match高于列的最大值,则期望的输出类似于列的最大值列的。如您所见,我已将其集成到解决方案中,但我正在寻找更优雅的解决方案。 R中的findInterval-function只处理严格增加的列,而我并非总是这样。
答案 0 :(得分:1)
您可以将函数定义为
fun_match <- function(data, value_to_match,col) {
max(tail(which(value_to_match >= data[col]), 1), 1)
}
fun_match(df, 6.5, "one")
#[1] 6
fun_match(df, 12.2, "two")
#[1] 5
fun_match(df, 2.5, "one")
#[1] 2
与fun_match_one
fun_match_one(-21, df)
#[1] 1
fun_match(df, -21, "one")
#[1] 1
fun_match_one(21, df)
#[1] 7
fun_match(df, 21, "one")
#[1] 7
fun_match_one(2.5, df)
#[1] 2
fun_match(df, 2.5, "one")
#[1] 2