按特定列按另一个data.frame过滤一个data.frame

时间:2017-09-07 16:57:23

标签: r dataframe

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, ]

打印一个带有警告的空data.frame:

  

警告讯息:   1:在完整$ group == filter $ group中:     较长的物体长度不是较短物体长度的倍数   2:完全$值>过滤$值:     较长的物体长度不是较短物体长度的倍数

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

> group
group  values
    a      5
    c      4

4 个答案:

答案 0 :(得分:2)

使用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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

使用基本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按组排序,并且每个data.frames在组变量中具有相同的级别。

答案 3 :(得分:1)

一种选择是使用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