R语言如何将单列中两文本间的数字转置到首文本相邻列
实现方法
你的需求本质是先识别列里的文本标识(即需要放在第一列的key值),将每个标识和它之后、下一个标识之前的数字划为同一组,再把每组逐行转置,空缺位置自动补NA即可,不需要用复杂的字符串间正则提取方案(你之前找的方案适合同一单元格内的文本提取,不适合这种逐行排列的结构化数据)。
几百行的数据用基础R就能快速处理,不需要额外安装依赖包,代码如下:
# 读取示例数据 df1 <- structure(list(column1 = c("STOUT", "18", "9341", "4", "0,2005", "STOUT", "1", "9341", "25", "0,2004", "STIN", "7", "9341", "0,2003", "OFF", "7", "L(1)", "9342", "0,2005")), class = "data.frame", row.names = c(NA, -19L)) # 将目标列转为字符型,避免因子类型导致的转换错误 df1$column1 <- as.character(df1$column1) # 识别key值:将逗号替换为小数点后无法转为数值的内容,就是文本标识 is_key <- is.na(as.numeric(gsub(",", ".", df1$column1))) # 为每个分组分配递增ID,每遇到一个keyID加1 group_id <- cumsum(is_key) # 按分组ID拆分数据 group_list <- split(df1$column1, group_id) # 计算最长组的长度,确定最终数据框的列数 max_col <- max(lengths(group_list)) # 每个组补全NA到统一长度,按行拼接为数据框 df2 <- as.data.frame( do.call(rbind, lapply(group_list, function(g) c(g[1], g[-1], rep(NA, max_col - length(g)))) ), stringsAsFactors = FALSE ) # 重命名列名 colnames(df2) <- paste0("column", 1:ncol(df2)) # 将数值列的逗号替换为小数点,转为数值格式 df2[, -1] <- lapply(df2[, -1], function(x) as.numeric(gsub(",", ".", x)))
运行以上代码得到的基础转置结果如下,符合你说的无需严格位置对齐的要求:
print(df2) column1 column2 column3 column4 column5 1 STOUT 18 9341 4 0.2005 2 STOUT 1 9341 25 0.2004 3 STIN 7 9341 0.2003 NA 4 OFF 7 <NA> NA NA 5 L(1) 9342 0.2005 NA NA
如果你需要和示例期望输出一样,把特定格式的值固定到对应列(比如4位编码934x固定在column3、带逗号的年份值固定在column5),只需要在分组后加一步格式判断,把对应值填充到指定列即可,基础转置逻辑不变。
内容的提问来源于stack exchange,提问作者vladimir mazoch
相关产品推荐
相关产品推荐

