【问题标题】:filter one data.frame by another data.frame by specific columns按特定列过滤一个 data.frame 通过另一个 data.frame
【发布时间】:2018-02-16 12:07:44
【问题描述】:
full = data.frame(group = c('a', 'a', 'a', 'a', 'a', 'b', 'c'), values = c(1, 2, 2, 3, 5, 3, 4))
filter = data.frame(group = c('a', 'b', 'c'), values = c(4, 3, 3))
## find rows of full where values are larger than filter for the given group
full[full$group == filter$group & full$values > filter$values, ]

打印一个带有警告的空数据框:

警告信息: 1:在 full$group == filter$group 中: 较长的对象长度不是较短对象长度的倍数 2:在 full$values > filter$values : 较长的对象长度不是较短对象长度的倍数

我正在寻找full 中符合该条件的所有行,最终得到: 满满的

> group
group  values
    a      5
    c      4

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    使用merge

    full=merge(full,filter,by='group')
    full=full[full$values.x>full$values.y,]
    full$values.y=NULL
    names(full)=c('group','values')
    > full
      group values
    5     a      5
    7     c      4
    

    match

    full$Filter=filter$values[match(full$group,filter$group)]
    full=full[full$values>full$Filter,]
    full$Filter=NULL
    > full
      group values
    5     a      5
    7     c      4
    

    【讨论】:

      【解决方案2】:
      full[unlist(sapply(1:NROW(filter), function(i)
          which(full$group == filter$group[i] & full$values > filter$values[i]))),]
      #  group values
      #5     a      5
      #7     c      4
      

      【讨论】:

        【解决方案3】:

        使用基本 R 函数 Mapsplitunlist 和您可以执行的逻辑索引

        full[unlist(Map(">", split(full$values, full$group), split(filter$values, filter$group))),]
          group values
        5     a      5
        7     c      4
        

        在这里,您将值向量按组拆分为列表,并将它们提供给Map,这适用于>。当Map 返回一个列表时,unlist 返回一个逻辑向量,该向量被馈送到[ 进行子集化。请注意,这要求两个 data.frames 都按组排序,并且每个数据帧在组变量中具有相同的级别。

        【讨论】:

          【解决方案4】:

          一种选择是使用dplyr

          library(dplyr)
          
          dt <- full %>%
            left_join(filter, by = "group") %>%
            dplyr::filter(values.x > values.y) %>%
            select(group, values = values.x)
          dt
            group values
          1     a      5
          2     c      4
          

          purrr

          library(purrr)
          
          dt <- full %>%
            split(.$group) %>%
            map2_df(filter %>% split(.$group), ~.x[.x$values > .y$values, ])
          dt
            group values
          1     a      5
          2     c      4
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-03-26
            • 1970-01-01
            • 2020-10-29
            • 1970-01-01
            • 2019-01-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多