基于条件语句重复行并修改多列观测值的R语言实现需求
实现R语言条件行复制与值修改的方案
嘿,我完全get到你想要实现的需求了——针对数据框中food等于1的行,既要修改原行的weight和prior_w,还要复制出一行做对应的字段调整对吧?我给你准备了两种可行的实现方法,一种用dplyr(更简洁易读),一种用基础R代码,你可以根据自己的习惯选择:
方法一:使用dplyr包(推荐)
这个方法通过生成行标识、展开多行,再针对性修改字段,逻辑清晰且易维护:
首先加载dplyr包:
library(dplyr)
然后运行核心代码:
# 定义原始数据框 df <- data.frame( date=c("2022-01-01","2022-01-02","2022-01-03","2022-01-04","2022-01-05"), food=c(0,0,0,1,0), prior_w=c(NA,NA,NA,2,NA), weight=c(5,4,3,6,4) ) df_2 <- df %>% # 对food=1的行标记为需要生成2行,其他行仅1行 mutate(row_id = ifelse(food == 1, list(c(1, 2)), list(1))) %>% # 将列表展开为多行 unnest(row_id) %>% # 根据行标识修改对应字段 mutate( # 原行(row_id=1):替换weight为prior_w,prior_w设为NA weight = case_when( food == 1 & row_id == 1 ~ prior_w, TRUE ~ weight ), prior_w = case_when( food == 1 & row_id == 1 ~ NA_real_, TRUE ~ prior_w ), # 复制行(row_id=2):将food改为0,其他字段保留原始值 food = case_when( food == 1 & row_id == 2 ~ 0, TRUE ~ food ) ) %>% # 移除辅助用的row_id列 select(-row_id) # 查看结果 df_2
运行后就能得到你期望的df_2,所有字段的修改都精准对应需求。
方法二:使用基础R代码
如果你不想加载额外包,用基础R也能实现:
# 定义原始数据框 df <- data.frame( date=c("2022-01-01","2022-01-02","2022-01-03","2022-01-04","2022-01-05"), food=c(0,0,0,1,0), prior_w=c(NA,NA,NA,2,NA), weight=c(5,4,3,6,4) ) # 第一步:提取并修改需要复制的行 copy_rows <- df[df$food == 1, ] copy_rows$food <- 0 # 将复制行的food改为0 # 第二步:修改原数据中food=1的行 df[df$food == 1, "weight"] <- df[df$food == 1, "prior_w"] df[df$food == 1, "prior_w"] <- NA # 第三步:将复制行插入到原行的后面 idx <- which(df$food == 1) # 找到原行的索引 df_2 <- rbind(df[1:idx, ], copy_rows, df[(idx+1):nrow(df), ]) # 查看结果 df_2
这个方法的逻辑是先处理复制行,再修改原行,最后通过索引拼接得到目标数据框,同样能达到预期效果。
内容的提问来源于stack exchange,提问作者Em Manuel
相关产品推荐
相关产品推荐

