如何用R和dplyr多次复制并替换重复记录中的特定值?
多次复制DataFrame记录并修改指定行的解决方案
原始数据定义
name <- c("Kiwi","Orange","Apple") val1 <- c(1,9,10) val2 <- c(1,1,1) df <- data.frame(name, val1, val2)
单次操作可行,但多次操作失效
你可以成功复制name == "Apple"的行并修改名称为"Strawberry":
df.2 <- df %>% filter(name == "Apple") %>% mutate(name = "Strawberry") %>% bind_rows(., df)
但按下面的方式多次执行时,无法得到预期结果:
df.2 <- df %>% filter(name == "Apple") %>% mutate(name = "Strawberry") %>% bind_rows(., df) %>% filter(name == "Apple") %>% mutate(name = "Dragonfruit") %>% bind_rows(., df)
预期结果
你想要得到的最终DataFrame是:
val1 <- c(10,10,1,9,10) val2 <- c(1,1,1,1,1) name <- c("Dragonfruit","Strawberry","Kiwi","Orange","Apple") expected.result <- data.frame(name, val1, val2)
问题原因与解决方法
你的多次操作里,每次bind_rows(., df)都会把原始df重新合并一次,导致最终数据里重复出现原始行,而不是只保留一次原始数据加上新增的两行。
正确的做法是先一次性生成所有需要复制修改的行,再和原始df合并:
# 提取Apple行作为模板 apple_template <- df %>% filter(name == "Apple") # 生成所有需要的新行(对应Strawberry和Dragonfruit) new_rows <- apple_template %>% mutate(name = c("Strawberry", "Dragonfruit")) # 合并新行与原始df,得到预期结果 result <- bind_rows(new_rows, df)
执行这段代码后,result就和你想要的expected.result一致了。
内容的提问来源于stack exchange,提问作者plast1cd0nk3y
相关产品推荐
相关产品推荐

