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

4

我有一些变量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)

I get:

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

我同意,第一步是回到开头,把所有的变量放在一个列表中。 - joran
不,原始变量有不同的名称。我在这里仅出于方便起见将它们称为var1、var2等。谢谢! - Georg
2个回答

7

这种方法是错误的。不要创建像这样命名的变量(并且,仅为澄清:您实际上称它们的名称相对不重要;重要的是您拥有相同一般形状的数据 - 这些数据应该归入一个同质容器中)。维护一个变量,它是列表、向量或矩阵(取决于您的数据)。

这将大大简化您的代码。

话虽如此,您的代码有一个非常明显的错误:您需要执行assign(..., x)而不是assign(…) <<- x,并指定目标环境。因此,在您的情况下:

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

4
能否将第一段设置为72号字体,最后一段设置为8号字体? - MichaelChirico
@MichaelChirico 你的评论把我搞得一头雾水。😄 — 是的,我同意,那样做是合适的。 - Konrad Rudolph
警告信息: 在assign(paste(substitute(x), "trun", sep = "_"), x, envir = parent.frame())中: 只有第一个元素被用作变量名。 - Georg
我在想是否可以将所有这些变量放入一个环境中,然后只更改名称。assign()很棘手。 - Rich Scriven
@Georg 这意味着你没有将变量传递给函数,而是传递了一个变量数组(trun(c('var1', 'var2')))。当然这样是行不通的。你需要对函数进行向量化处理。但说实话,我要重申这不是正确的方法,而且你显然已经将那些单独的变量放在一个数组中了。 - Konrad Rudolph
谢谢,Konrad。我会尝试列出变量列表,然后使用lapply。 - Georg

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接