【问题标题】:How to exchange parts of a variable name in a function in R?如何在R中的函数中交换部分变量名?
【发布时间】:2021-09-02 08:43:01
【问题描述】:

我尝试多次运行一段代码 (t1-t13)。由于所有变量名称都以相关时间点的名称开头,因此我尝试编写一个函数,我想在其中简单地替换变量名称中的“t1”,例如 t1_ls_3。为此,我使用 paste 函数将以下代码块转换为一个函数,其中仅应替换时间点。一个简短的例子:

我需要一种方法来更改此行中的 t1: data$t1_ls_3 <- 11

我试过了,它成功了:

data[paste(“t1”, "ls_3", sep = "_")] <- 11
data <- data[paste(“t1”, "ls_3", sep = "_")]

然后我试着把它写成一个函数:

func_replace <- function(x = “time”) {
  data[paste(“time”, "ls_3", sep = "_")] <- 11
  data <- data[paste(“time”, "ls_3", sep = "_")]
 
}
func_replace (x = “t1“)

但是,当我运行该函数时,R 所做的只是将一个新变量放入数据框中,time_ls_3 并且不会更改实际变量 t1_ls_3。 您是否知道问题出在哪里,或者我如何在函数中交换部分变量名?我知道我可以通过使用长格式数据集来解决这个问题。但我想知道如何在函数中交换部分变量。

【问题讨论】:

  • 您的问题代码中有“花式引号”,可能是在自动更正它们的过程中的某个步骤。为了使任何事情起作用,您需要用常规引号替换它们。
  • tidyverse 解决方案将使用renamerename_with。你说长格式可以避免这个问题是正确的:我敦促你探索它对这个问题和其他问题的好处。
  • 至于你的问题,你需要分配函数输出。 data &lt;- func_replace(x = "t1")。我强烈建议使用将data 作为参数传递给函数,这样无论调用什么数据,您都可以使用该函数。
  • 如果您需要更多帮助,请分享几行数据作为可重现的示例。
  • 在函数中将&lt;- 更改为&lt;&lt;- 可能会有所帮助。

标签: r function replace


【解决方案1】:

您的基本误解似乎是关于字符串和符号。

您在 R 中使用"' 定义一个字符串。因此如下:

"time"

是一个字符串,里面有time这个词。

相比之下,符号是可以引用 R 中的对象的名称。您可以创建一个符号(指向一个对象)来保存称为时间的时间,如下所示:

time <- "03:00"

当你在控制台输入time时,你会得到字符串:

time
#"03:00"

因此,当您尝试将paste"time" 一起使用时,无论如何您都会得到相同的结果:

paste("time", "ls_3", sep = "_")
#[1] "time_ls_3"

相反,您似乎想使用 x,这是您的函数将 "t1" 分配给的符号。

也许你的数据看起来像这样:

data <- setNames(data.frame(t(rep(0,5))),sapply(1:5,\(x)paste0("t",x,"_ls_3")))
data
#  t1_ls_3 t2_ls_3 t3_ls_3 t4_ls_3 t5_ls_3
#1       0       0       0       0       0

最后一个问题是函数内部的赋值只能在函数环境中起作用,所以需要使用&lt;&lt;-操作符。

func_replace <- function(x = NULL) {
  data[paste(x, "ls_3", sep = "_")] <<- 11
  }

func_replace(x = “t1“)
data
#  t1_ls_3 t2_ls_3 t3_ls_3 t4_ls_3 t5_ls_3
#1      11       0       0       0       0

【讨论】:

    猜你喜欢
    • 2023-02-03
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    相关资源
    最近更新 更多