【问题标题】:Calling a character string into object names within a function在函数中将字符串调用为对象名称
【发布时间】:2020-08-03 07:43:24
【问题描述】:

我目前有一段非常冗长且重复的代码,用于数据规范化和反转 ((x-min)/(max-min)*-1)+1),我想稍微清理一下。

这是当前外观的一个小样本:

W3_E1_Norm_New <- W3_E1_Average%>%
  mutate(W3_E1_Norm_New = ((W3_E1_zoo-W3_E1_Min)/(W3_E1_Max-W3_E1_Min)*-1)+1)
W3_E2_Norm_New <- W3_E2_Average%>%
  mutate(W3_E2_Norm_New = ((W3_E2_zoo-W3_E2_Min)/(W3_E2_Max-W3_E2_Min)*-1)+1)
W3_E3_Norm_New <- W3_E3_Average%>%
  mutate(W3_E3_Norm_New = ((W3_E3_zoo-W3_E3_Min)/(W3_E3_Max-W3_E3_Min)*-1)+1)

每个'W3_E1'对应一个样本ID,目前每个样本ID每次都需要写出两行代码。 理想情况下,我想编写一个函数,可以将字符串(Sample_IDs)调用到每个数据帧的名称中,所以类似于

a_Norm_New

会返回

W3_E1_Norm_New

然后

W3_E2_Norm_New

等等

有没有办法编写一个函数来完成这个?

非常感谢

【问题讨论】:

    标签: r string function character


    【解决方案1】:

    我没有您的数据,但这应该可以。定义一个函数:

    my_fun <- function (x) {
    
      norm_new <- paste0(x,"_Norm_New")
      average <- paste0(x,"_Average")
      zoo <- paste0(x, "_zoo")
      min <- paste0(x, "_Min")
      max <- paste0(x, "_Max")
    
       df <- get(average) %>%
        mutate(new_norm = ((zoo - min) / (max - min) * - 1) + 1)
    
      assign(df, norm_new)
    }
    

    然后运行一个for循环:

    Sample_IDs <- c("W3_E1", "W3_E2", "W3_E3")
    
    for (i in Sample_IDs) {
      my_fun(i)
    }
    

    【讨论】:

    • 抱歉延迟回复您,我已经有一段时间没有处理这个脚本了。运行此代码时,我收到错误“二进制运算符的非数字参数”你对此有什么建议吗?
    【解决方案2】:

    使用data.table,编写使用带引号的变量名的函数非常容易(参见a blog post I wrote on the subject)。

    在这里,我们使用 sufx 变量将列名的模式粘贴到各处:

    library(data.table)
    
    normalize <- function(dt, sufx = "W3_E1"){
      df <- as.data.table(dt)
      df[, (paste0(sufx,"_Norm_New")) := (
        (get(paste0(sufx,_zoo)) - get(paste0(sufx,"_Min"))
         )/(
           get(paste0(sufx,"_Max")) - get(paste0(sufx,"_Min"))
            )*-1)+1)
    }
    

    这里的代码不容易阅读,因为我想证明这可以在一行中完成,但您可以轻松地提高可读性。

    在此解决方案中,您使用 get 取消引用您的变量名。

    【讨论】:

      猜你喜欢
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多