使用外部文件分配变量名称及其值

问题描述 投票:0回答:1

我当前正在从外部文件读取数据,如下所示:

param_file <- tribble(
  ~model, ~variable, ~value,
  "BAX", "year", "2023",
  "BAX", "version", "Saint_XL, Sinner_XY",
  "BAX", "metric", "ATE, OFCE",
  "LAX", "time", "2024",
  "LAX", "model2", "Saint_XX, Sinner_XW",
  "LAX", "method", "TEA, CEOF")

然后,我将行分开并筛选出我想要运行的模型,在本例中为 BAX:

param_file2 <- param_file %>% 
  separate_rows(value, sep = ",") %>% 
  mutate(value = trimws(value)) %>% 
  filter(model == "BAX")

看起来像这样:

  model variable value    
  <chr> <chr>    <chr>    
1 BAX   year     2023     
2 BAX   version  Saint_XL 
3 BAX   version  Sinner_XY
4 BAX   metric   ATE      
5 BAX   metric   OFCE   

我想知道是否有一种方法可以自动将变量及其值分配为字符向量:

对于 BAX 模型,这些将是:

year <- param_file2 %>% filter(variable == "year") %>% pull(value)
version <- param_file2 %>% filter(variable == "version") %>% pull(value)
metric <- param_file2 %>% filter(variable == "metric") %>% pull(value)

和洛杉矶国际机场模型:

time <- param_file2 %>% filter(variable == "time") %>% pull(value)
model2 <- param_file2 %>% filter(variable == "model2") %>% pull(value)
method <- param_file2 %>% filter(variable == "method") %>% pull(value)

这些给了我想要的答案,但每次我想为每个模型定义一个新变量时,我都需要编写一行新代码。我想知道是否有一种方法可以将变量列中读取的任何内容分配给其相应的值,而不必每次都编写新的代码行。

即 如果外部文件中出现了 2 个新行,如下所示:

param_file <- tribble(
  ~model, ~variable, ~value,
  "BAX", "pasta", "sauce",
  "BAX", "jalapenos", "are, spicy")

然后我想要定义如下的 2 个新变量(无需用新行显式分配它们)...理想情况下使用函数或 purrr 循环:

> pasta
[1] "sauce"
> jalapenos
[1] "are"   "spicy"
r dplyr purrr
1个回答
0
投票

这个问题是使用基本 R 的

assign
purrr::walk
系列函数的一个很好的例子。

这个

tidyverse
策略将会起作用,特别是因为OP在帖子中标记了
purrr
。 (我在这里使用
purrr::walk2
,因为不会有输出,代码会根据需要默默地创建新变量)。

library(tidyverse)
param_file <- tribble(
  ~model, ~variable, ~value,
  "BAX", "year", "2023",
  "BAX", "version", "Saint_XL, Sinner_XY",
  "BAX", "metric", "ATE, OFCE",
  "LAX", "time", "2024",
  "LAX", "model2", "Saint_XX, Sinner_XW",
  "LAX", "method", "TEA, CEOF")

library(magrittr, warn.conflicts = F)

# Check that no other variable exists other than data
ls()
#> [1] "param_file"

param_file %>% 
  mutate(value = map(value, ~unlist(str_split(.x, pattern = ", ")))) %$% 
  purrr::walk2(variable, value, ~ assign(.x, .y, envir = .GlobalEnv))

# Recheck that variables have been created
ls()
#> [1] "method"     "metric"     "model2"     "param_file" "time"      
#> [6] "version"    "year"

#print first one to check
get(ls()[1])
#> [1] "TEA"  "CEOF"

创建于 2024-03-20,使用 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.