我有一些变量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.
答案 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