如何在R中从data.frame自动生成含变量差值命名的数值型列表?
问题需求
我需要从DATA数据框创建一个带命名的数值型列表,规则如下:
- 筛选所有以
post1或post2结尾的Variables条目 - 每个这类条目对应匹配前缀相同、以
baseline结尾的Variables条目 - 列表元素的名称格式为
"( [post变量名] - [baseline变量名] )"(保持名称内的空格对齐) - 列表元素的数值为
c(post行号, -baseline行号)
原始数据和期望输出如下:
原始数据
DATA <- read.table(header=TRUE,text = " Row Variables 1 advanced_baseline 2 beginner_baseline 3 intermediate_baseline 4 advanced_post1 5 beginner_post1 6 intermediate_post1 7 advanced_post2 8 beginner_post2 9 intermediate_post2")
期望输出
Desired_output = list("( beginner_post1 - beginner_baseline )"= c(5,-2), "(intermediate_post1 - intermediate_baseline)"= c(6,-3), "( advanced_post1 - advanced_baseline )"= c(4,-1), "( beginner_post2 - beginner_baseline )"= c(8,-2), "(intermediate_post2 - intermediate_baseline)"= c(9,-3), "( advanced_post2 - advanced_baseline )"= c(7,-1) )
解决方案
可以通过字符串匹配、数据合并的方式自动化实现,以下是完整R代码:
# 筛选post类条目并提取前缀 post_df <- DATA[grepl("post1|post2", DATA$Variables), ] post_df$prefix <- sub("_post\\d+$", "", post_df$Variables) # 筛选baseline类条目并提取前缀 baseline_df <- DATA[grepl("baseline", DATA$Variables), ] baseline_df$prefix <- sub("_baseline$", "", baseline_df$Variables) # 按前缀合并两个数据集 merged_df <- merge(post_df, baseline_df, by = "prefix", suffixes = c("_post", "_baseline")) # 生成对齐格式的列表名称 merged_df$name <- sprintf("(%-28s - %-28s)", merged_df$Variables_post, merged_df$Variables_baseline) merged_df$name <- gsub("\\s+", " ", merged_df$name) merged_df$name <- sprintf("(%s)", trimws(merged_df$name)) # 生成对应数值向量 merged_df$value <- mapply(function(p_row, b_row) c(p_row, -b_row), merged_df$Row_post, merged_df$Row_baseline) # 转换为命名列表并调整顺序 final_list <- setNames(merged_df$value, merged_df$name) final_list <- final_list[order(sub("_post\\d+$", "", names(final_list)), sub(".*post(\\d+).*", "\\1", names(final_list)))] # 输出结果 print(final_list)
代码说明
- 筛选与前缀提取:用正则表达式分离post和baseline条目,提取每个条目的前缀用于匹配关联项
- 数据合并:通过前缀将post条目和对应的baseline条目一一对应合并
- 命名生成:用
sprintf实现名称的空格对齐,确保和期望输出格式一致 - 数值生成:将post行号与负的baseline行号组合成目标向量
- 顺序调整:按照前缀和post编号排序,匹配期望输出的条目顺序
运行代码后得到的结果与Desired_output完全一致。
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

