R语言数据清洗需求:多数据点时统一采用second数据点值
R语言数据清洗:同步second采集点的gender字段到同id所有记录
原始数据集
df <- data.frame(id = c(1,1,1, 2,2,2, 3,3, 4,4, 5), text = c("female","male","male", "female","female","female", "male","female","male", "female", "female"), time = c("first","second","third", "first","second","third", "first","second","second", "third", "first"))
解决方案
方案1:使用dplyr(tidyverse工具链)
library(dplyr) df_cleaned <- df %>% group_by(id) %>% mutate( # 提取当前id下second采集点的gender值 second_gender = first(text[time == "second"]), # 存在second记录则替换全组text,否则保留原数据 text = ifelse(!is.na(second_gender), second_gender, text) ) %>% select(-second_gender) %>% ungroup() # 输出结果 df_cleaned
方案2:Base R实现(无需额外安装包)
# 按id拆分数据集 split_groups <- split(df, df$id) # 逐个处理每个id的分组 cleaned_groups <- lapply(split_groups, function(group) { second_gender <- group$text[group$time == "second"] # 若存在second采集记录,替换当前id所有text if (length(second_gender) > 0) { group$text <- second_gender[1] } return(group) }) # 合并分组并重置行号 df_cleaned <- do.call(rbind, cleaned_groups) rownames(df_cleaned) <- NULL # 输出结果 df_cleaned
验证结果
两种方法都会得到符合预期的清洗后数据:
id text time 1 1 male first 2 1 male second 3 1 male third 4 2 female first 5 2 female second 6 2 female third 7 3 female first 8 3 female second 9 4 male second 10 4 male third 11 5 female first
内容的提问来源于stack exchange,提问作者amisos55
相关产品推荐
相关产品推荐

