You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用dplyr基于df2的条件过滤df1并统计符合条件的行数?

问题解决:基于范围条件统计行数并添加至数据框

错误原因分析

  1. 长度不匹配:mutate默认是向量化操作,直接传入df2$A_min和df2$A_max时,这两个是长度为2的向量,但between要求左右边界是单个标量(对应df2的每一行),因此触发"left must be length 1"的错误。
  2. 拼写错误:代码里的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 01:37:00