如何修正data.frame中部分行的列值左移问题(tidyverse优先)
基于tidyverse的数据集错位修正方案
针对你的数据集因部分行缺失age数据导致列值左移的问题,可通过以下tidyverse方法修正,核心是识别age列中实际为日期的异常行,将列值右移并补全age列的NA:
方法一:行级原始值保存+条件修正
library(tidyverse) df_fixed <- df %>% rowwise() %>% # 先保存当前行的所有原始列值 mutate( orig_age = age, orig_birthday = birthday, orig_address = address ) %>% # 标记age为日期格式的异常行(包含分隔符"-") mutate( is_abnormal = str_detect(age, "-"), # 异常行:age设为NA,后续列依次接收前一列的原始值 age = ifelse(is_abnormal, NA_character_, age), birthday = ifelse(is_abnormal, orig_age, birthday), address = ifelse(is_abnormal, orig_birthday, address), favorite_fruit = ifelse(is_abnormal, orig_address, favorite_fruit) ) %>% # 移除辅助列并取消行级分组 select(-c(orig_age, orig_birthday, orig_address, is_abnormal)) %>% ungroup()
方法二:利用原始数据批量修正(更简洁)
借助cur_data()获取每行原始数据,避免列值修改后的连锁影响:
df_fixed <- df %>% mutate( # 保存当前行的原始数据 raw_data = list(cur_data()), # 异常行的birthday取原始age值 birthday = case_when( str_detect(age, "-") ~ raw_data[[1]]$age, TRUE ~ birthday ), # 异常行的address取原始birthday值 address = case_when( str_detect(age, "-") ~ raw_data[[1]]$birthday, TRUE ~ address ), # 异常行的favorite_fruit取原始address值 favorite_fruit = case_when( str_detect(age, "-") ~ raw_data[[1]]$address, TRUE ~ favorite_fruit ), # 异常行的age填充NA age = case_when(str_detect(age, "-") ~ NA_character_, TRUE ~ age) ) %>% # 移除辅助列 select(-raw_data)
修正后结果
执行上述任一代码后,得到的正确数据集如下:
#> # A tibble: 3 x 5 #> name age birthday address favorite_fruit #> <chr> <chr> <chr> <chr> <chr> #> 1 josh 26 1998-04-14 1 main st banana #> 2 jason NA 2000-09-01 2 front st apple #> 3 nate NA 1992-dec-25 3 oak st blueberry
内容的提问来源于stack exchange,提问作者joshbrows
相关产品推荐
相关产品推荐

