如何用dplyr基于df2的条件过滤df1并统计符合条件的行数?
问题解决:基于范围条件统计行数并添加至数据框
错误原因分析
- 长度不匹配:
mutate默认是向量化操作,直接传入df2$A_min和df2$A_max时,这两个是长度为2的向量,但between要求左右边界是单个标量(对应df2的每一行),因此触发"left must be length 1"的错误。 - 拼写错误:代码里的
norw()是笔误,正确写法是nrow()。
正确实现方法
方法1:用rowwise()逐行处理(dplyr风格)
通过rowwise()让dplyr对df2逐行迭代,确保每一行的A_min和A_max作为单个值传入过滤逻辑:
library(dplyr) df1 <- data.frame(A=c(1,2,3,4), B=c(1,2,3,4)) df2 <- data.frame(A_min=c(2,3), A_max=c(3,3)) df2 <- df2 %>% rowwise() %>% mutate(Score = df1 %>% filter(between(A, A_min, A_max)) %>% nrow()) %>% ungroup() # 取消行分组,避免后续操作受影响 print(df2)
方法2:用map2_int()遍历配对值(purrr+dplyr)
利用purrr的map2_int()函数,遍历A_min和A_max的每一对元素,返回整数类型的统计结果:
library(dplyr) library(purrr) df2 <- df2 %>% mutate(Score = map2_int(A_min, A_max, ~nrow(filter(df1, between(A, .x, .y)))))
方法3:基础R实现(无需tidyverse)
用sapply()逐行提取df2的边界条件,通过sum()统计符合条件的行数(逻辑向量求和等价于计数):
df1 <- data.frame(A=c(1,2,3,4), B=c(1,2,3,4)) df2 <- data.frame(A_min=c(2,3), A_max=c(3,3)) df2$Score <- sapply(1:nrow(df2), function(i) { sum(between(df1$A, df2$A_min[i], df2$A_max[i])) }) print(df2)
输出结果
三种方法都会得到你期望的结果:
A_min A_max Score 1 2 3 2 2 3 3 1
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

