如何使用dplyr为id关联的纵向数据按规则创建新变量
完全可以通过dplyr实现该需求,具体操作步骤如下:
步骤1:自定义众数计算函数
R基础包没有内置众数计算函数,我们先定义一个简单的求众数函数:
get_mode <- function(v) { uniqv <- unique(v) # 返回出现次数最多的第一个值,若需处理多众数场景可自行调整逻辑 uniqv[which.max(tabulate(match(v, uniqv)))] }
步骤2:通过dplyr处理数据
我们先计算每个id对应的x列众数生成映射表,再将原数据的id2与映射表匹配得到y值:
library(dplyr) # 示例数据 id <- c(1, 1, 1, 2, 2, 2) id2 <- c(NA, NA, NA, 1, 1, 1) x <- c(4, 5, 5, 1, 1, 1) dat1 <- data.frame(id, id2, x) # 生成每个id对应的x众数映射表 id_mode_map <- dat1 %>% group_by(id) %>% summarise(x_mode = get_mode(x), .groups = "drop") # 匹配得到y值 dat_result <- dat1 %>% left_join(id_mode_map, by = c("id2" = "id")) %>% rename(y = x_mode)
输出结果验证
运行后得到的dat_result和预期结果完全一致:
> dat_result id id2 x y 1 1 NA 4 NA 2 1 NA 5 NA 3 1 NA 5 NA 4 2 1 1 5 5 2 1 1 5 6 2 1 1 5
内容的提问来源于stack exchange,提问作者C.F.
相关产品推荐
相关产品推荐

