R语言如何仅对指定行应用separate拆分列值并写入已有列
R数据拆分修复方案
先将你提供的示例数据赋值为数据框df:
df <- structure(list(Rank = c("23", "24", "25", "26"), `Race Number` = c("13", "11", "29", "30"), Name = c("FOSS Tobias S.", "McNULTY Brandon", "BENNETT George", "KUKRLE Michael"), `NOC Code` = c("NOR", "USA", "NZL", "CZE"), `Split 1 at 9.7km` = c("13:47.65(22)", "13:28.23(15)", "14:05.46(30)", "14:05.81(32)"), `Split 2 at 15.0km` = c("19:21.16(22)", "19:04.80(18)", "19:47.53(31)", "19:48.77(32)"), `Split 3 at 22.1km` = c("29:17.44(24)", "29:01.94(20)", "29:58.88(28)", "29:58.09(27)"), `Split 4 at 31.8km` = c("44:06.82(24)", "43:51.67(23)", "44:40.28(25)", "44:42.74(26)"), `Split 5 at 37.1km` = c("49:49.65(24)", "49:40.49(23)", "50:21.82(25)1:00:28.39 (25)", "50:30.02(26)1:00:41.55 (26)" ), `Final Time` = c("59:51.68 (23)", "59:57.73 (24)", "", ""), `Time Behind` = c("+4:47.49", "+4:53.54", "+5:24.20", "+5:37.36" ), `Average Speed` = c("44.302", "44.228", "43.854", "43.696" )), class = "data.frame", row.names = c(NA, -4L))
解法1:基于separate的分组合并法(适配你已知的separate用法)
思路是拆分正常行和异常行,仅对异常行执行拆分操作,再合并恢复原顺序:
library(tidyverse) # 筛选Final Time非空的正常行 df_normal <- df %>% filter(`Final Time` != "") # 筛选Final Time为空的异常行,拆分Split 5列补全Final Time df_abnormal <- df %>% filter(`Final Time` == "") %>% # 以右括号后为拆分点,将拼接的两部分拆分到对应列 separate(`Split 5 at 37.1km`, into = c("Split 5 at 37.1km", "Final Time"), sep = "(?<=\\))") # 合并两类数据并按Rank排序恢复原顺序 df_clean <- bind_rows(df_normal, df_abnormal) %>% arrange(as.numeric(Rank))
解法2:全量正则匹配法(更简洁)
不需要拆分数据集,通过正则匹配拆分内容,仅对异常行执行替换:
library(tidyverse) df_clean <- df %>% mutate( # 匹配Split 5的两部分:第一组为标准Split5格式,第二组为拼接的Final Time tmp = str_match(`Split 5 at 37.1km`, "^(\\d+:\\d+\\.\\d+\\(\\d+\\))(.*)$"), `Split 5 at 37.1km` = ifelse(`Final Time` == "", tmp[,2], `Split 5 at 37.1km`), `Final Time` = ifelse(`Final Time` == "", tmp[,3], `Final Time`) ) %>% select(-tmp)
两种方法处理后得到的df_clean就是修正完成的数据,第3、4行的Split 5和Final Time列均已拆分补全。
内容的提问来源于stack exchange,提问作者krzych27
相关产品推荐
相关产品推荐

