You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:13:18