R中不同范围内的值[已关闭]

xpcnnkqh  于 2023-03-10  发布在  其他
关注(0)|答案(2)|浏览(127)

已关闭。此问题需要超过focused。当前不接受答案。
**想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

2天前关闭。
社区正在审查是否从昨天开始重新讨论这个问题。
Improve this question
我有一个不同范围的网格grd,如下所示:

> grd
   count  treshold
1   1      0.01
2   2      0.02
3   3      0.05
4   4      0.10
5   5      0.20

和一个 Dataframe df,如下所示:

> df
    param   name
1   0.124   Tim
2   0.011   John
3   0.002   Alex
4   0.023   Jessica
5   0.056   Rose

我想使用grd$treshold向 Dataframe 添加另一列,df$bucket报告df$param中的值属于哪个范围。
例如,param的第一个值0.124高于阈值0.10,则它将落入计数5。第二个值0.011在0.01和0.02之间,则它将落入计数2,依此类推。
这是最终的结果:

> df
        param   name      bucket
    1   0.124   Tim         5
    2   0.011   John        2
    3   0.002   Alex        1
    4   0.023   Jessica     3
    5   0.056   Rose        4
to94eoyn

to94eoyn1#

base解决方案与findInterval()

df$bucket <- findInterval(df$param, grd$treshold) + 1

df$bucket
# [1] 5 2 1 3 4

还可以将滚动联接与dplyr一起使用:

library(dplyr)

df %>%
  left_join(grd, by = join_by(closest(param < treshold))) %>%
  select(-treshold)

#   param    name count
# 1 0.124     Tim     5
# 2 0.011    John     2
# 3 0.002    Alex     1
# 4 0.023 Jessica     3
# 5 0.056    Rose     4
数据
grd <- read.table(text = "
count  treshold
1   1      0.01
2   2      0.02
3   3      0.05
4   4      0.10
5   5      0.20")

df <- read.table(text = "
param   name
1   0.124   Tim
2   0.011   John
3   0.002   Alex
4   0.023   Jessica
5   0.056   Rose")
fhity93d

fhity93d2#

下面是使用dplyr的可能解决方案

library(dplyr)
df <- df |> 
  mutate(
    bucket = case_when(
      param <= 0.01 ~ 1,
      param <= 0.02 ~ 2,
      param <= 0.05 ~ 3,
      param <= 0.10 ~ 4,
      param <= 0.20 ~ 5
    )
  )

就我对您问题的理解而言,您在问题中分享的最终结果是不正确的(第2行)。如果我误解了,您可以轻松调整case_when()中的阈值参数

相关问题