R语言中复制DataFrame行并修改city列值的实现求助
解决方法
首先修正你原代码里的列名错误(cod_ubicacion应该是city),然后在复制行之后,通过分组标记+自定义命名的方式修改city列,以下是完整实现:
library(dplyr) # 你的原始DataFrame df <- tibble( city = c("city1", "city2"), value = c(15, 20) ) # 完整处理代码 df %>% # 添加复制次数列,修正列名为city mutate(ncity = if_else(city == "city1", 4, 5)) %>% # 按指定次数复制行 slice(rep(seq_len(n()), ncity)) %>% # 按原始行分组,区分city1和city2的复制组 group_by(original_group = rep(seq_len(nrow(df)), c(4, 5))) %>% mutate( # 组内行号 row_in_group = row_number(), # 按需求指定每组的city名称 city = case_when( original_group == 1 ~ paste0("city", c(1, 3, 4, 5)[row_in_group]), original_group == 2 ~ paste0("city", c(2, 6, 7, 8, 9)[row_in_group]) ) ) %>% # 取消分组,移除辅助列 ungroup() %>% select(-ncity, -original_group, -row_in_group)
代码说明
- 修正列名:原代码中
cod_ubicacion是笔误,替换为实际列名city; - 行复制:
slice(rep(...))按指定次数(city1复制4次、city2复制5次)生成重复行; - 分组标记:
group_by(original_group)把复制后的行按原始数据的行分组,确保能精准控制每组的city命名; - 自定义命名:通过
case_when结合组内行号,直接映射到你需要的city名称; - 清理输出:移除过程中生成的辅助列,得到最终目标DataFrame。
如果后续需要处理更多城市,也可以用更灵活的自动编号方式(避免手动写名称列表):
df %>% mutate(ncity = if_else(city == "city1", 4, 5)) %>% slice(rep(seq_len(n()), ncity)) %>% mutate( # 提取原始city的数字部分 base_num = as.integer(stringr::str_extract(city, "\\d+")), # 定义每组的编号序列 num_seq = case_when( base_num == 1 ~ c(1, 3:5), base_num == 2 ~ c(2, 6:9) ) ) %>% mutate(city = paste0("city", num_seq)) %>% select(-ncity, -base_num, -num_seq)
内容的提问来源于stack exchange,提问作者dvera
相关产品推荐
相关产品推荐

