R中基于subject字符列填充group列缺失值的实现方法
首先修正你的示例数据的两处小问题:字符类型的subject值需加引号,两个列的向量长度需匹配,修正后的示例数据如下:
df <- data.frame( subject = c("a1_1", "a1_1", "a1_1", "a1_1", "a1_2", "a1_2", "b1_1", "b1_1", "b1_1", "b1_1"), group = c(1, NA, NA, NA, NA, 1, NA, NA, 2, NA) )
以下是几种常用的实现方式:
方法1:tidyverse套件实现(可读性最高)
用dplyr分组后配合tidyr的fill函数填充即可:
library(dplyr) library(tidyr) df_filled <- df %>% group_by(subject) %>% # 若确认每个subject的非NA group值一定在首行,.direction参数可省略,默认向下填充 fill(group, .direction = "downup") %>% ungroup()
方法2:base R实现(无需安装额外依赖)
用分组统计函数ave对每个subject提取首个非NA的group值赋值到全组:
df$group <- ave(df$group, df$subject, FUN = function(x) na.omit(x)[1])
方法3:data.table实现(适合大体积数据集,运算速度最快)
library(data.table) # 转换为data.table格式 setDT(df) # 按subject分组后赋值 df[, group := na.omit(group)[1], by = subject]
内容的提问来源于stack exchange,提问作者EGF1
相关产品推荐
相关产品推荐

