基于特征表按块复制列创建空数据框的R实现需求
解决方案
我们可以通过分组处理块、生成重复列名、匹配数据类型三个步骤来实现需求,具体代码如下:
1. 加载依赖包
需要用到tibble创建表格,dplyr分组处理,stringr提取块标识,purrr批量生成列:
library(tibble) library(dplyr) library(stringr) library(purrr)
2. 定义原始描述表
descr <- tibble( varCat = c("a", "b_x", "b_y", "c_m", "c_n"), rept = c(1, 3, 3, 2, 2), form = c("text", "num", "text", "int", "text") )
3. 标记块并生成列名与类型规则
首先为每行数据标记所属块,然后按块生成带重复后缀的列名,并对应好数据类型:
# 为每行添加块标识,并提取块级重复次数 descr_with_block <- descr %>% mutate(block = str_split(varCat, "_", n = 2) %>% map_chr(1)) %>% group_by(block) %>% mutate(block_rept = first(rept)) %>% ungroup() # 生成最终的列名与对应类型规则 col_spec <- descr_with_block %>% group_by(block) %>% group_map(function(data, key) { reps <- seq_len(data$block_rept[1]) # 按重复次数生成列名:重复次数为1时不加后缀,否则加"_数字" map_dfr(reps, function(i) { col_name <- ifelse(data$block_rept[1] == 1, data$varCat, paste0(data$varCat, "_", i)) tibble(col_name = col_name, col_type = data$form) }) }) %>% bind_rows()
4. 创建空的目标tibble
通过类型映射,生成对应数据类型的空列并组合成最终表格:
# 定义格式到R数据类型的映射 type_map <- c( "text" = "character()", "num" = "double()", "int" = "integer()" ) # 生成空tibble d <- map_dfc(col_spec$col_name, function(name) { # 获取当前列对应的类型表达式 type_expr <- parse_expr(type_map[col_spec$col_type[col_spec$col_name == name]]) # 创建长度为0的对应类型向量作为空列 !!sym(name) := eval(type_expr)[0] }) %>% as_tibble()
运行后查看d,结果与需求完全一致:
> d # A tibble: 0 × 11 # … with 11 variables: a <chr>, b_x_1 <dbl>, b_y_1 <chr>, b_x_2 <dbl>, # b_y_2 <chr>, b_x_3 <dbl>, b_y_3 <chr>, c_m_1 <int>, c_n_1 <chr>, # c_m_2 <int>, c_n_2 <chr>
内容的提问来源于stack exchange,提问作者Turtle
相关产品推荐
相关产品推荐

