R语言按ID列分组重复填充同组weight列有效值的实现方法
问题原因
你写的df %>% group_by(ID) %>% rep(weight)报错,是因为rep()不是dplyr链路中处理分组列的合法调用:管道操作会把前一步生成的分组tibble作为第一个参数传给rep(),但rep()的第一个参数要求是待重复的向量,传入整个数据框自然会触发报错,同时代码也没有指定修改weight列的动作,逻辑上不成立。
你的测试数据构造代码:
df<- data.frame(ID=c(1,1,1,2,2,3,3,3,4,4),weight=c(0,0,11,0,10,12,0,0,13,0))
目标是按ID分组后,把每组唯一的非零weight值填充到组内所有行。
实现方法
dplyr 实现(最简洁)
加载dplyr后用mutate修改列即可,分组后计算得到的单值会自动循环填充到组内每一行,不需要手动调用rep():
library(dplyr) df1 <- df %>% group_by(ID) %>% mutate(weight = weight[weight != 0][1]) %>% ungroup()
运行后输出和你预期完全一致:
# A tibble: 10 × 2 ID weight <dbl> <dbl> 1 1 11 2 1 11 3 1 11 4 2 10 5 2 10 6 3 12 7 3 12 8 3 12 9 4 13 10 4 13
代码中加[1]是为了取组内第一个非零值,适配你每组恰好有一个非零值的场景,避免异常报错。
base R 实现(无需加载第三方包)
如果不想依赖tidyverse生态,直接用基础包的ave函数就能完成分组计算:
df$weight <- with(df, ave(weight, ID, FUN = function(x) x[x != 0][1]))
内容的提问来源于stack exchange,提问作者mehmo
相关产品推荐
相关产品推荐

