【问题标题】:Modify variable names and variables within R function修改R函数中的变量名和变量
【发布时间】:2015-11-11 15:36:50
【问题描述】:

我有一些变量var1, var2, ..., var100

我想创建新变量var1_trun, var2_trun, ..., var100_trun

应该与var1, var2, ..., var100 具有相同的值除了高于 90% 的值。这些值应设置为等于原始变量的 90%。

最好的方法是什么?

我试过了:

 trun <- function(x) {

 assign(paste0(substitute(x),"_trun"))<<-x
 assign(paste0(substitute(x),"_trun"))[x>quantile(x, probs=seq(0,1,0.05))[19]]<<-quantile(x, probs=seq(0,1,0.05))[19]
  }

 trun(data$var1)

我明白了:

Error in assign(paste0(substitute(x), "_trun")) <<- x : 
  object 'x' not found.

【问题讨论】:

  • 我同意,第一步是回到开头,将所有变量放在一个列表中。
  • 不,原始变量有不同的名称。我在这里将它们称为 var1, var2,... 只是为了方便......谢谢!

标签: r function paste assign


【解决方案1】:

这确实是错误的方法。不要创建像这样命名的变量(并且,澄清一下:您实际称呼它们的名称相对不重要;重要的是您拥有相同形状的数据——这些数据属于同质容器)。维护 一个 变量,即列表、向量或矩阵(取决于您的数据)。

这将大大简化您的代码。

也就是说,您的代码有一个非常直接的错误:您需要使用assign(…, x) 而不是assign(…) &lt;&lt;- x,并指定目标环境。所以,在你的情况下:

assign(paste(substitute(x), "trun", sep = "_"), x, envir = parent.frame())

【讨论】:

  • 有什么办法可以把第一段用72号字体,最后一段用8号字体?
  • @MichaelChirico 你的评论把我弄糊涂了。 :D — 是的,我同意,这是正确的。
  • 警告信息:在 assign(paste(substitute(x), "trun", sep = "_"), x, envir = parent.frame()) 中:只有第一个元素用作变量名
  • 我想知道是否可以将所有这些变量放入一个环境中并更改名称。 assign() 恶心
  • @Georg 这意味着您没有将变量传递给函数,而是一个变量数组 (trun(c('var1', 'var2')))。当然那是行不通的。您需要对函数进行矢量化。但老实说,我要重申这不是正确的方法,而且您显然已经将这些单独的变量放在一个数组中。
【解决方案2】:

这个怎么样?

假设:你的变量在一个命名列表中:

x<-c(1:10)
y<-c(10:100)
vars <- list(x,y)
names(vars)=c("x","y")

那么你可以这样做:

# preparing the variables
x<-c(1:10)
y<-c(10:100)
vars <- list(x,y)
names(vars)=c("x","y")

# original and truncated variable names
varlist <- c("x", "y")
trunname <- function(x){ paste0(x, "_trun")  }

# truncate a vector: all values < 90% percentile remain unchanged, others:=(90% percentile)
trun <- function(x){  ifelse(x<=quantile(x,0.9),x,quantile(x,0.9)) }

# truncate each element of a list
vars_trun <- lapply(vars, function(x){ trun(x) })

# rename the truncated variables
names(vars_trun) <- trunname(varlist)

输出:

$x
 [1]  1  2  3  4  5  6  7  8  9 10

$y
 [1]  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45
[37]  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81
[73]  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100

$x_trun
 [1] 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 9.1

$y_trun
 [1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
[49] 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 91 91 91 91 91 91 91 91 91

【讨论】:

    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多