修改R函数中的变量名称和变量

时间:2015-08-18 15:39:19

标签: r function paste assign

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

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

应与var1, var2, ..., var100 具有相同的值,但值高于90%-percentile。这些值应设置为等于原始可用物品的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.

2 个答案:

答案 0 :(得分:4)

这是非常错误的做法。不要创建这样命名的变量(并且,只是为了澄清:你实际上称之为它们的是相对不重要的;重要的是你有相同的一般形状的数据 - 这些数据属于一个同类容器)。维护一个变量,即列表,向量或矩阵(取决于您的数据)。

这将极大地简化您的代码。

也就是说,您的代码有一个非常简单的错误:您需要执行assign(…) <<- x而不是assign(…, x),并指定目标环境。所以,在你的情况下:

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

答案 1 :(得分:0)

怎么样?

假设:您的变量位于命名列表中:

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