首页 > 解决方案 > 如何在R中的函数中交换部分变量名?

问题描述

我尝试多次运行一段代码(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。您是否知道问题出在哪里,或者我如何在函数中交换部分变量名?我知道我可以通过使用长格式数据集来解决这个问题。但我想知道如何在函数中交换部分变量。

标签: rfunctionreplace

解决方案


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

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

"time"

是一个字符串,其中包含单词 time。

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

time <- "03:00"

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

time
#"03:00"

因此,当您尝试使用pastewith 时"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

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

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

推荐阅读