【问题标题】:Return list of columns containing data outside a predetermined range in r返回包含 r 中预定范围之外的数据的列列表
【发布时间】:2019-11-09 15:55:06
【问题描述】:

为了仅针对感兴趣的列过滤 data.frame,我需要在此 data.frame 中找到包含特定范围之外数据的列。 让data.frame成为

df<-data.frame(x1=c(1,5,9),x2=c(10,20,30),x3=c(20,100,1000))
ranges<-data.frame(y1=c(3,8),y2=c(10,20), y3=c(15,1250))

作为输出,我想要一个返回 colnames 的列表:"x1","x2"

我尝试了以下方法,但代码仅在“范围”包含下面指定的所有数字时才有效,并且在找到数字时匹配。不幸的是,这不是我需要的。

ranges<-c(15:300,10:20)
df.l<-colnames(df)[sapply(df,function(x) any(x %in% ranges))]

有什么想法吗? 谢谢!

【问题讨论】:

    标签: r range match multiple-columns columnname


    【解决方案1】:

    如果 'ranges' 是一个 data.frame 或列表,一个选项是

    names(which(unlist(Map(function(x, y) any(!(x >= y[1] & x <= y[2])), df, ranges))))
    #[1] "x1" "x2"
    

    或者使用相反的逻辑

    names(which(unlist(Map(function(x, y) any(x < y[1]| x > y[2]), df, ranges))))
    

    或者在tidyverse中,

    library(purrr)
    library(dplyr)
    library(tibble)
    map2(df, ranges, ~ between(.x, .y[1], .y[2]) %>% `!` %>% any) %>% 
        enframe %>% 
        unnest(cols = value) %>% 
        filter(value) %>% 
        pull(name)
    #[1] "x1" "x2"
    

    数据

    ranges <- data.frame(y1 = c(3, 8), y2 = c(10, 20), y3 = c(15, 1250))
    

    【讨论】:

    • 感谢您的快速回复。 Data.frame,确实。对于示例,它运行良好。我只是检查代码的功能以及它是否适用于我的“真实”数据。
    • @Juan 如果它不起作用,请提供一个模仿您真实数据的示例
    • @Juan 当我们使用map2Map时,基本上是循环遍历'df'和'ranges'对应的每一列,所以,这里的'x'是每一个的匿名函数'df' 列即 x1、x2、x3 和 'y' 对应于 'y1'、'y2'、'y3' 并从那里选择索引为 y[1]、y[ 的该列的每个元素2]
    • 它确实适用于更大的数据框,因此我首先感到困惑。
    • @Juan mapmap2 不同,这里我们使用 map2 map 只需要一个输入
    猜你喜欢
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 2016-02-20
    • 1970-01-01
    • 2020-08-08
    相关资源
    最近更新 更多