【问题标题】:Function in R to rename variables and compute R codeR中的函数重命名变量和计算R代码
【发布时间】:2020-07-23 09:18:27
【问题描述】:

我想写一个从数据框中取出变量列表的函数,比如:

df <- data.frame(a = c(1,2,3,4,5), b = c(6,7,8,9,10))

并且要始终计算相同的计算,例如计算标准偏差:

test.function <- function(var){ 
  for (i in var) {
  paste0(i, "_per_sd") <-  i / sd(i)
  }
  }

为了创建一个新变量 a_per_sd 除以它的标准差。不幸的是,我遇到了Error in paste0(i, "_per_sd") &lt;- i/sd(i) : could not find function "paste0&lt;-" 错误。

预期的用法应该是:

test.function(df$a, df$b)

预期的结果应该是:

> df$a_per_sd
[1] 0.6324555 1.2649111 1.8973666 2.5298221 3.1622777

对于给定的所有其他变量。 不知何故,我认为我应该使用 as.formula 和/或 eval,但我可能正在做一个思考错误。 非常感谢您的关注和帮助。

【问题讨论】:

  • 你从哪里得到sds?获得相同值的sd 对我来说似乎并不直观。
  • 标准差应该在整个列上计算(在这种情况下,i 在循环中)。在这种情况下,整个 df$a 的 sd 是 1.581139,我希望变量的每一行都除以 sd。

标签: r function


【解决方案1】:

这就是你所追求的吗?

df <- data.frame(a = c(1,2,3,4,5), b = c(6,7,8,9,10))

test.function <- function(...){
    x <- list(...)
    xn <- paste0(unlist(eval(substitute(alist(...)))),
                 "_per_sd")
    setNames(lapply(x, function(y) y/sd(y)), xn)
}

cbind(df, test.function(df$a, df$b))
#>   a  b df$a_per_sd df$b_per_sd
#> 1 1  6   0.6324555    3.794733
#> 2 2  7   1.2649111    4.427189
#> 3 3  8   1.8973666    5.059644
#> 4 4  9   2.5298221    5.692100
#> 5 5 10   3.1622777    6.324555

reprex package (v0.3.0) 于 2020 年 7 月 23 日创建

【讨论】:

  • 非常感谢,成功了!!对函数中的许多参数使用 (...) 非常优雅...不知道这一点。再次感谢
【解决方案2】:

这个问题对我来说并不完全清楚,但您可能会通过这些方法获得行/列或向量的 sd:

apply(as.matrix(df), MARGIN = 1, FUN = sd) #across rows
#[1] 3.535534 3.535534 3.535534 3.535534 3.535534

apply(as.matrix(df), MARGIN = 2, FUN = sd) #across columns
#       a        b 
#1.581139 1.581139 

lapply(df, sd) #if you provide list of vectors (columns of `df` in this case)
#$a
#[1] 1.581139
#
#$b
#[1] 1.581139

【讨论】:

  • 非常感谢您的帮助。但是,使用这种方法,我无法传递数据帧的特定变量,我希望将该特定变量重命名并除以整个列的标准差。
【解决方案3】:

我已经走到这一步了。这是你要找的吗?

test.function <- function(var)
  
{
 newvar = paste(var, "_per_sd")
 assign(newvar, var/sd(var))
 get(newvar)
 
 }

输入:

test.function(df$a)

结果:

[1] 0.6324555 1.2649111 1.8973666 2.5298221 3.1622777

我从这里得到了这个想法:Assignment using get() and paste()

【讨论】:

  • 亲爱的打字员,非常感谢。这非常接近......我仍然需要两个功能:1.一个循环输入多个变量,如 test.function(df$a, df$b...) 和 2. 包括新的可能性现有数据框 df 中的变量。如果我们也能做到这一点,那就太好了!再次感谢。
  • 我确定有办法,但我还在学习。这是一个有用的链接:stackoverflow.com/questions/48694626/…
【解决方案4】:

最后这就是我的代码的样子:

    test.function <- function(...){
    x <- list(...)
    xn <- paste0(unlist(eval(substitute(alist(...)))),
                 "_per_sd")
    setNames(lapply(x, function(y) y/sd(y, na.rm = TRUE)), xn)
    }
test.function.wrap  <- function(..., dataframe) {
  assign(deparse(substitute(dataframe)),   cbind(dataframe, test.function(...)) , envir=.GlobalEnv) 
}


test.function.wrap(df$a, df$b , dataframe = df)

为了能够将新变量分配给现有数据框,我将(绝对是天才)提示放在一起,并将函数包装在另一个函数中以达到目的。我知道它可能不那么优雅,但它确实有效!

【讨论】:

    猜你喜欢
    • 2013-01-26
    • 2018-07-11
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 2015-11-11
    相关资源
    最近更新 更多