在R中查找最近的较大数字

bz4sfanl  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(147)

我有这样一个数据集:

row  num Group
  1 3     B
  2 6     A
  3 12    A
  4 15    B
  5 16    A
  6 18    A
  7 20    B
  8 25    A
  9 27    B
 10 29    B

在R中,我希望将输入数字与num中的值进行比较,并且我希望仅在Group A中找到最接近的较大值的位置。
例如,如果输入数字为8,则组A中最接近的较大值应为12,我希望获得其位置,该位置应为3。如果输入数字为18,则返回值应为18,位置应为6。如果输入数字为20,则返回值应为25,位置应为8。
我尝试了which.min,但由于某种原因,无论输入编号是多少,总是返回索引1。

#called the dataset f

which.min(f$num[f$Group=="A"][f$num[f$Group=="A"]>=8])

我想仍然使用基地R,如果可能的话,我会感谢任何想法上的部分,我做错了,如何修复它。

  • 谢谢-谢谢
xzlaal3s

xzlaal3s1#

对于最接近的更大num,您可以用公式表示函数:

nearest_bigger_num <- function(num, vec) {
  which(min(vec[num < vec]) == vec)
}

nearest_bigger_num(8, df$num)
## 3

但是,在您的情况下,您甚至希望计算组。

nearest_bigger_num_in_group <- function(num, df, group) {
  df <- df[df$group == group]
  df <- df[num < df$num]
  df$row[which.min(df$num)]
}

nearest_bigger_num_in_group(8, df, "A")
## 3
kkbh8khc

kkbh8khc2#

使用ifelse()将不满足条件的元素替换为NA,然后对生成的向量使用which.min()

which.min(ifelse(f$Group == "A" & f$num >= 8, f$num, NA))
# 3

which.min(ifelse(f$Group == "A" & f$num >= 18, f$num, NA))
# 6

你的解不起作用的部分原因是,通过子集化,你改变了元素的位置,所以which.min()返回的位置与你的原始向量不对应。通过替换为NA s,你保留了原始位置。

ccrfmcuu

ccrfmcuu3#

这里有两种方法

x1月0n1x日

library(dplyr)

df <-
  data.frame(
    row = 1:10,
    num = cumsum(rep(3,10)),
    group = c("B","A","A","B","A","A","B","A","B","B")
  )

df %>% 
  filter(num >= 8) %>% 
  slice_min(order_by = row)

  row num group
1   3   9     A

基本R

df[min(df$row[(df$num >= 8)]),]

  row num group
1   3   9     A

相关问题