我正在从一个外部文件读取数据,该文件看起来像这样:

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)

LAX模型:

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

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

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

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

然后,我希望2个新的变量定义如下(而不必显式地分配这些新的行).最好使用函数或purrr循环,例如:

> pasta
[1] "sauce"
> jalapenos
[1] "are"   "spicy"

推荐答案

这个问题是使用Base R的assignpurrr::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

R相关问答推荐

使用tidyverse / Mutate的存款账户余额

无法将传奇添加到cowplot多情节中

在R中替换函数中的特定符号

更改默认系列1以更改名称

在特定Quarto(reveal.js)幻灯片上隐藏徽标

RStudio中相关数据的分组箱形图

哪一行和行和 Select 特定行,但是考虑到Nas

方法::slotName如何处理非类、非字符的参数?

从服务器在Shiny中一起渲染图标和文本

从多面条形图中删除可变部分

将数据集旋转到长格式,用于遵循特定名称模式的所有变量对

优化从每个面的栅格中提取值

减少雨云面之间的间距并绘制所有统计数据点

如何将EC50值绘制在R中的剂量-react 曲线上?

需要一个函数来在第一行创建一个新变量,然后用新变量替换一个不同的变量(对于多行)

如何使投篮在R中保持一致

roxygen2正在处理太多的文件

如何准确地指出Read_delim所面临的问题?

创建两个变量组合的索引矩阵

如果缺少时间,如何向日期-时间列添加时间