R语言如何基于另一个dataframe的数值过滤并计算新列取值
错误原因
你原代码报错的核心是filter(A == df1$A)的逻辑错误:df1$A是长度等于df1行数的完整向量,和df2的A列长度不匹配,无法实现逐行对应df1的A值筛选df2的需求。
最优解决方案(推荐)
先对df2按A分组预计算比率,再通过关联匹配给df1加新列,该方法避免逐行遍历,大样本下效率更高:
library(dplyr) # 预计算每个A值对应的C值 df2_ratio <- df2 %>% group_by(A) %>% # sum(B>0.5)直接统计符合条件的行数,n()是当前分组总条数,round保留2位小数匹配示例 summarise(C = round(sum(B > 0.5)/n(), 2)) # 关联到df1 df1 <- left_join(df1, df2_ratio, by = "A")
逐行计算方案(仅适合小数据集)
如果确实需要逐行匹配计算,可以用rowwise()实现逐行取值:
library(dplyr) df1 <- df1 %>% rowwise() %>% mutate(C = round(sum(df2$A == A & df2$B > 0.5) / sum(df2$A == A), 2)) %>% ungroup() # 取消行分组避免后续操作异常
两种方案输出的df1的C列都完全匹配你给出的预期结果。
内容的提问来源于stack exchange,提问作者fdafda12
相关产品推荐
相关产品推荐

