确定最接近指定值的data.frame中的条目

时间:2016-08-10 10:28:59

标签: r dataframe

我有一个输入"值"我想找出R

中下面数据框的前两列中最接近的值
value = 20003

数据

  Min_Benefs   Max_Benefs  MSR_Min   MSR_Max
  5000         5999        0.039     0.036
  6000         6999        0.036     0.034
  7000         7999        0.034     0.032
  8000         8999        0.032     0.031
  9000         9999        0.031     0.03
  10000        14999       0.03      0.027
  15000        19999       0.027     0.025
  20000        49999       0.025     0.022
  50000        59999       0.022     0.02
  60000        0.02                  0.02

预期输出

20000

尝试:

closestLoc = which(min(abs(data[,c(1,2)]-value)))
closestVal = data[,c(1,2)][which(min(abs(data[,c(1,2)]-value)))]

所以,我想找出最近的输入数字"值"来自数据框的前两列"数据"。提前谢谢。

2 个答案:

答案 0 :(得分:3)

您可以使用unlist()从两列创建单个向量,然后在其中找到最接近的值:

vec <- unlist(df[,c(1,2)]) # create vector
vec[which.min(abs(vec - value))] # find nearest value
#Min_Benefs8 
#      20000 

答案 1 :(得分:0)

节省计算时间并仅提供布尔矢量。所有这些嵌套的东西都会降低你的代码的可读性,imho。

blah <- data.frame(x = seq.int(10)*1000, y = seq.int(10)*1000 + 999)

tmpin <- 9003
blah %>% dplyr::filter(x <= tmpin & y > tmpin)
# OR
blah[with(blah, x <= tmpin & y > tmpin),]
# OR
base::subset(blah, x <= tmpin & y > tmpin)

编辑:我在开始时误解了这个问题。不过,可以进行简单的扩展:

blah %>% 
  dplyr::filter(x <= tmpin & y > tmpin) %>%
  summarise(minum = ifelse(x + y > 2*tmpin, x ,y))

但它没有其他答案所建议的那么短。