在R中如何根据虚拟变量值合并行数不等的两个数据集
R 不等行数据框按虚拟变量出现顺序匹配合并方案
首先修正原示例中df2的创建代码错误(原代码写为data.frame(a,b),实际应为data.frame(z,y)),可直接运行以下代码完成需求,全程无循环,采用向量化操作实现:
基础R实现(无需加载第三方包)
# 构造示例数据 x <- c(3,4,5,3,5,1,4,5) y <- c(0,0,1,0,1,1,0,0) df1 <- data.frame(x,y) z <- c(7,8,9) y <- c(1,1,1) df2 <- data.frame(z,y) # 合并操作 df1$z <- 0 # 定位df1中y取值为1的行位置 match_pos <- which(df1$y == 1) # 按出现顺序匹配df2的z值 df1$z[match_pos] <- df2$z[seq_along(match_pos)]
tidyverse 实现(dplyr 语法)
library(dplyr) df1 <- df1 %>% mutate(z = case_when( # 用cumsum统计y=1的出现顺序,直接匹配df2的z下标 y == 1 ~ df2$z[cumsum(y == 1)], TRUE ~ 0 ))
两种方法输出结果均符合要求:
> df1 x y z 1 3 0 0 2 4 0 0 3 5 1 7 4 3 0 0 5 5 1 8 6 1 1 9 7 4 0 0 8 5 0 0
注:该方案默认df2的z列长度与df1中y=1的行数一致,若长度不匹配可根据实际需求补充截断/补全规则。
内容的提问来源于stack exchange,提问作者Vincent C
相关产品推荐
相关产品推荐

