【问题标题】:Is there a R function to filter a data frame by a determined range of values?是否有 R 函数通过确定的值范围过滤数据框?
【发布时间】:2022-01-01 06:19:41
【问题描述】:

这个问题可能已经在任何地方得到了回答,但我是 R 的新手,在寻找解决方案几个小时后我没有找到任何东西,所以对于一个可能多余的问题,我很抱歉。

我有一个由 3 列和 10.000 多行组成的数据框。列是时间、速度和加速度。我想要做的是只选择速度等于 3、3.2 或 3.4 或 3.6 的那些行......直到这个特定数据帧中存在的速度最大值(想象最大值为 10.3。因此,我要过滤的最后一个值是 10.2)。但是,这个最大值在未来这样的数据帧中会有所不同(这是来自具有特定最大速度的足球运动员的数据)。

我的数据框称为“ASdata”,我想创建另一个名为“ASdata_only”的数据框,其中只有速度为 == 3、3.2、3.4... 的行,直到最大值(增加 0.2)。

这是我尝试过的:

ASdata_only<-ASdata %>% filter(speed==3 | speed==3.2 | speed==3.4)

但它带来了两个问题:

(1) 这非常耗时,因为这样我就必须包括每个速度,而且肯定有更简单的方法来做到这一点。

(2) 对于每个数据帧,我必须事先找到最大值才能知道何时停止。

我什至不知道这个问题的结构是否合理:对此我也很抱歉。 非常感谢您的帮助!

【问题讨论】:

    标签: r dataframe filter


    【解决方案1】:

    您可以使用 seq 制作一个“列表”,其中包含最小值、最大值和步长。然后您可以使用带有 %in% 的 filter() 来仅保留序列中的值:

    my_list <- round(seq(3, 10.4, 0.2), 1)
    
    ASdata %>% filter(speed %in% my_list)
    

    要解决评论中的问题,写一个函数最简单:

    only_in_range <- function(data, speed_var = speed){
      min <- summarise(data, min = min({{ speed_var }})) %>% pull(min)
      max <- summarise(data, max = max({{ speed_var }})) %>% pull(max)
      range <- round(seq(min, max, 0.2), 1)
      
      data %>%
        filter({{ speed_var }} %in% range)
    }
    

    该函数查找默认设置为速度的速度变量的最小值和最大值 - 但如果它在其他帧中不同,您可以键入名称。

    创建一个四舍五入到小数点后 1 位的序列(命名范围),以尽量避免浮点问题,然后仅过滤您的数据框以查找范围内的值。

    【讨论】:

    • 嗨!非常感谢您的帮助!这绝对是我尝试的一个进步。但是,10.4 可能不是未来数据帧中的最大值。有什么办法可以设置这个起始值为 3,增加为 0.2,但最大值是由每个数据帧个性化的?像 max(speed) 这样的想法?
    • 将根据您的评论编辑答案^
    • %in% 与浮点数一起使用不是很可靠。例如:0.3 %in% seq(0, 1, by=0.1) 返回 False。
    • 好捕获,需要一轮(seq(0, 1, .1), 1) 捕获0.3。不确定它现在有多强大,但已经编辑了上面的函数。
    • 太棒了!这个解决方案解决了我的问题!非常有用,也是我熟悉功能的一种方式。非常感谢!
    【解决方案2】:

    使用 dplyr

    library(dplyr)
    
    a = 3 # smallest amount
    b = max(ASdata$speed) #biggest amount of speed in the dataframe
    d = 0.2 # incremental amount
    
    ASdata_only<-ASdata %>% filter(speed %in% round(seq(a,b,d),1))
    
    

    【讨论】:

    • 嗨,Macosso,这个解决方案也解决了我的问题,而且是一种非常简单的方法。非常感谢!
    • 我很高兴听到这也解决了您的问题。但请记住,通常的做法是对解决您问题的答案进行投票,这会激励人们为您的问题提供解决方案。
    • 是的,当然!感谢 cmets,我是新来的,还不完全了解它是如何工作的。我对您的评论投了赞成票,但它表明我需要在投票前达到 15 名声望。但是,我认为反馈已被存储,并且可能会出现。可以吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    相关资源
    最近更新 更多