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
答案 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函数Map
,split
,unlist
和逻辑索引可以做
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