R语言如何将变量列表追加到dataframe指定行的列表列中
需求说明
我创建了一个用于错误校验的RMarkdown,它会输出print语句指明具体错误及需要修正的行号(校验对象为下文的df)。我另外创建了一个dataframe(示例中名为df.index),用于跟踪df中每一列需要修正的行。核心需求是新增一列存储df各列需修正的行号列表,后续进行更多错误校验时,可向新建的summary数据框rows列的指定行已有列表追加新值,也可为其他行新增列表。
目前的实现虽然能得到正确结果,但过于冗长,团队成员很难读懂,希望优化:不需要每次创建obs变量,也不需要在追加列表时手动指定行号,支持不同列自定义校验规则,可直接向summary的rows列添加/追加列表值,自动去重、去除NA。
最小示例数据
library(dplyr) # 待校验的数据集 df <- structure( list( `1.1.` = c("Andrew", "Max", "Sylvia", NA, "1", NA, NA, "Jason"), `1.2.` = c(1, 2, 2, NA, NA, 5, 3, NA), `1.3.` = c( "cool", "amazing", "wonderful", "okay", NA, "sweet", "chocolate", "fine" ) ), class = "data.frame", row.names = c(NA, -8L) ) # 列索引表,用于生成各列待修改行的汇总 df.index <- structure(list( number = c("1.1.", "1.2.", "1.3."), name = c("name", "number", "category") ), class = "data.frame", row.names = c(NA, -3L))
优化实现方案
我们可以封装一个通用的追加错误行的辅助函数,复用重复逻辑,代码简洁好维护:
# 初始化summary表,rows列默认存空列表 summary <- df.index %>% mutate(rows = list(integer(0))) # 辅助函数:给指定列追加错误行号,自动去重、去NA add_error_rows <- function(summary_df, col_number, new_rows) { summary_df %>% mutate(rows = ifelse( number == col_number, list(unique(na.omit(c(unlist(rows[number == col_number]), new_rows)))), rows )) } # ---------------- 逐个校验列,调用函数即可 ---------------- # 校验1.1.列:NA值 summary <- add_error_rows(summary, "1.1.", which(is.na(df$`1.1.`))) # 校验1.1.列:字符列中存在的数值 + 示例重复值6 summary <- add_error_rows(summary, "1.1.", c(which(!is.na(as.numeric(as.character(df$`1.1.`)))), 6)) # 校验1.2.列:值大于2 summary <- add_error_rows(summary, "1.2.", which(df$`1.2.` > 2)) # 校验1.2.列:值等于2 summary <- add_error_rows(summary, "1.2.", which(df$`1.2.` == 2)) # 校验1.3.列:值等于okay summary <- add_error_rows(summary, "1.3.", which(df$`1.3.` == "okay"))
输出结果(和预期完全一致)
summary # number name rows # 1 1.1. name 4, 6, 7, 5 # 2 1.2. number 6, 7, 2, 3 # 3 1.3. category 4
方案优势
- 没有重复代码,所有追加逻辑都封装在
add_error_rows函数里,团队成员只需调用函数传参即可,学习成本极低 - 不需要手动指定行号,只需传入列的编号(比如
1.1.),函数自动匹配对应行操作 - 自动处理列表追加、去重、去除NA,不需要每次都写重复的
unlist/append/unique/na.omit逻辑 - 扩展性强,后续新增校验规则只需新增一行
add_error_rows调用即可,逻辑清晰易读
内容的提问来源于stack exchange,提问作者AndrewGB
相关产品推荐
相关产品推荐

