从数据框列中提取数字并将错位字符合并至另一列
修复PDF抓取后列对齐混乱的数据框
从扫描转可编辑的旧PDF抓取数据后,得到的数据框出现列对齐混乱——部分第二列的字符被混入第一列末尾。示例数据如下:
df1 <- data.frame(A = c("1253", "3534 n", "9348", "0945", "9457 h", "89745 g"), B = c("uiop", "iud", "eidj", "iodw", "ops", "ios"), stringsAsFactors = FALSE) df1 # A B # 1 1253 uiop # 2 3534 n iud # 3 9348 eidj # 4 0945 iodw # 5 9457 h ops # 6 89745 g ios
需要实现的效果是:提取第一列的纯数字内容,把第一列末尾的多余字符拼接到对应行的第二列开头,处理后的数据如下:
df2 <- data.frame(A = c("1253", "3534", "9348", "0945", "9457", "89745"), B = c("uiop", "niud", "eidj", "iodw", "hops", "gios"), stringsAsFactors = FALSE) df2 # A B # 1 1253 uiop # 2 3534 niud # 3 9348 eidj # 4 0945 iodw # 5 9457 hops # 6 89745 gios
解决方案
以下两种方法均可处理2000行规模的数据集:
方法一:使用stringr包(更简洁)
# 先安装包(首次运行时执行) # install.packages("stringr") library(stringr) # 提取第一列的纯数字部分 df1$A_clean <- str_extract(df1$A, "\\d+") # 提取第一列末尾的非数字字符并去除空格 extra_chars <- str_trim(str_remove(df1$A, "\\d+")) # 将多余字符拼接到第二列开头,无多余字符则保留原内容 df1$B_clean <- ifelse(extra_chars == "", df1$B, paste0(extra_chars, df1$B)) # 整理成目标数据框 df2 <- data.frame(A = df1$A_clean, B = df1$B_clean, stringsAsFactors = FALSE)
方法二:基础R实现(无需额外包)
# 提取第一列的纯数字 df1$A_clean <- gsub("[^0-9]", "", df1$A) # 提取第一列末尾的多余字符并去除空格 extra_chars <- trimws(gsub("^\\d+\\s*", "", df1$A)) # 拼接多余字符与第二列内容 df1$B_clean <- mapply(function(char, text) { if(char == "") text else paste0(char, text) }, extra_chars, df1$B) # 生成结果数据框 df2 <- data.frame(A = df1$A_clean, B = df1$B_clean, stringsAsFactors = FALSE)
内容的提问来源于stack exchange,提问作者Ophelia Hanson
相关产品推荐
相关产品推荐

