如何在R语言中按条件复制并修改数据
R语言按条件复制数据并修改的实现方案
初始数据
df1 <- data.frame( value = c("0","0","50","0","25","67"), Name = c("alpha","beta","charli","alpha","beta","charli"), Position = c("A","A","A","B","B","A") )
需求说明
需要完成以下操作:
- 筛选出
value > 0且Position = "A"的行并复制一份 - 原筛选行:将
value设为"0",保持Position = "A" - 复制行:保留原
value,将Position改为"B" - 合并所有行得到最终数据框
实现方案
方法1:使用dplyr包(推荐,代码更直观)
library(dplyr) # 筛选需要处理的目标行 target_rows <- df1 %>% filter(as.numeric(value) > 0 & Position == "A") # 修改原目标行:value置为0 modified_original <- target_rows %>% mutate(value = "0") # 修改复制行:Position改为B copied_modified <- target_rows %>% mutate(Position = "B") # 合并所有行并排序对齐示例结果 df <- df1 %>% filter(!(as.numeric(value) > 0 & Position == "A")) %>% bind_rows(modified_original, copied_modified) %>% arrange(match(Name, c("alpha", "beta", "charli")), Position) # 查看结果 print(df)
方法2:使用Base R
# 定义筛选条件 condition <- as.numeric(df1$value) > 0 & df1$Position == "A" # 提取目标行 target_rows <- df1[condition, ] # 修改原目标行 modified_original <- target_rows modified_original$value <- "0" # 修改复制行 copied_modified <- target_rows copied_modified$Position <- "B" # 合并数据并排序对齐示例 df <- rbind(df1[!condition, ], modified_original, copied_modified) df <- df[order(match(df$Name, c("alpha", "beta", "charli")), df$Position), ] rownames(df) <- NULL # 重置行名 # 查看结果 print(df)
最终结果
两种方法都会得到符合要求的最终数据框:
# value Name Position # 1 0 alpha A # 2 0 alpha B # 3 0 beta A # 4 25 beta B # 5 0 charli A # 6 50 charli B # 7 0 charli A # 8 67 charli B
内容的提问来源于stack exchange,提问作者Fadhil Dzikri
相关产品推荐
相关产品推荐

