【问题标题】:dplyr, filter if both values are above a number [duplicate]dplyr,如果两个值都大于数字,则过滤[重复]
【发布时间】:2020-07-02 14:56:04
【问题描述】:

我有一个这样的数据集。

df = data.frame(Business = c('HR','HR','Finance','Finance','Legal','Legal','Research'), Country = c('Iceland','Iceland','Norway','Norway','US','US','France'), Gender=c('Female','Male','Female','Male','Female','Male','Male'), Value =c(10,5,20,40,10,20,50))

我需要过滤掉男性值和女性值都 >= 10 的所有行。例如,应删除 Iceland HR 以及 Research France。

我尝试过df %>% group_by(Business,Country) %>% filter((Value>=10)),但这会过滤掉任何小于 10 的值。有什么想法吗?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    也许这会有所帮助:

    library(reshape2)
    df2 <- reshape(df,idvar = c('Business','Country'),timevar = 'Gender',direction = 'wide')
    df2 %>% mutate(Index=ifelse(Value.Female>=10 & Value.Male>=10,1,0)) %>%
      filter(Index==1) -> df3
    df4 <- reshape2::melt(df3[,-5],idvar=c('Business','Country'))
    
      Business Country     variable value
    1  Finance  Norway Value.Female    20
    2    Legal      US Value.Female    10
    3  Finance  Norway   Value.Male    40
    4    Legal      US   Value.Male    20
    

    【讨论】:

    • 不完全是,我想删除 HR Iceland 并只保留挪威和美国。
    • 只需放置Index==1@TedMosby 我更新了解决方案。
    【解决方案2】:

    您可以只使用两个ave 步骤,一个使用length,一个使用min

    df <- df[with(df, ave(Value, Country, FUN=length)) == 2, ]
    df[with(df, ave(Value, Country, FUN=min)) >= 10, ]
    #   Business Country Gender Value
    # 3  Finance  Norway Female    20
    # 4  Finance  Norway   Male    40
    # 5    Legal      US Female    10
    # 6    Legal      US   Male    20
    

    请注意,如果我们干扰数据框,这也有效。

    set.seed(42)
    df2 <- df[sample(1:nrow(df)), ]
    
    df2 <- df2[with(df2, ave(Value, Country, FUN=length)) == 2, ]
    df2[with(df2, ave(Value, Country, FUN=min)) >= 10, ]
    #   Business Country Gender Value
    # 5    Legal      US Female    10
    # 6    Legal      US   Male    20
    # 3  Finance  Norway Female    20
    # 4  Finance  Norway   Male    40
    

    【讨论】:

    • 这是一个不错的解决方案,但我需要确保每个企业和国家都有男性和女性变量,并且这两个值都高于 10。
    • @TedMosby ave 也可以做到这一点。刚刚更新了我的答案!
    猜你喜欢
    • 2020-10-13
    • 2020-01-02
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    相关资源
    最近更新 更多