[英]The Loop in My Function does not change my data type (in R)
我打算使用一个函数来节省重复程序的打字工作。 许多事情已经在起作用,但并非一切都在起作用。 这是代码:
quicky <- function(df, factors){
output <- as.character(substitute(factors)[-1])
print(output)
df[,output]
for(i in names(df[,output])){
hist(df[,as.character(i)])
df[,as.character(i)] <- as.factor(df[,as.character(i)])#<- Why does this not work?
}
}
quicky(mtcars, c(cyl,hp,drat))
请求帮助和解释! 提前致谢。
当我们遍历从 'output' 创建的列名时,只需遍历这些列名,而不是进一步对数据进行子集化并获取 te names
。 另外,在函数中,最后return
数据集
quicky <- function(df, factors){
output <- as.character(substitute(factors)[-1])
print(output)
for(i in output){
df[[i]] <- as.factor(df[[i]])
}
df
}
out <- quicky(mtcars, c(cyl,hp,drat))
str(out)
#'data.frame': 32 obs. of 11 variables:
# $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
# $ cyl : Factor w/ 3 levels "4","6","8": 2 2 1 2 3 2 3 1 1 2 ... ###
# $ disp: num 160 160 108 258 360 ...
# $ hp : Factor w/ 22 levels "52","62","65",..: 11 11 6 11 15 9 20 2 7 13 ...###
# $ drat: Factor w/ 22 levels "2.76","2.93",..: 16 16 15 5 6 1 7 11 17 17 ...###
# $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
# $ qsec: num 16.5 17 18.6 19.4 17 ...
# $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
# $ am : num 1 1 1 0 0 0 0 0 0 0 ...
# $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
# $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
注意:将[
更改为[[
以便它适用于data.table
和tbl_df
quickly
的原因是未能将分配结果返回到df
的列是 R for
循环的一个特殊功能。 它返回NULL。 在您的quicky
函数中评估的最后一个函数是for
。 因此,您需要做的就是在循环外添加对df
值的调用:
quicky <- function(df, factors){
output <- as.character(substitute(factors)[-1])
print(output)
df[,output]
for(i in names(df[,output])){
hist(df[,as.character(i)])
df[, i] <- as.factor(df[, i ])
}; df # add a call to evaluate `df`
}
str( quicky(mtcars, c(cyl,hp,drat)) )
#-------
[1] "cyl" "hp" "drat"
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : Factor w/ 3 levels "4","6","8": 2 2 1 2 3 2 3 1 1 2 ...
$ disp: num 160 160 108 258 360 ...
$ hp : Factor w/ 22 levels "52","62","65",..: 11 11 6 11 15 9 20 2 7 13 ...
$ drat: Factor w/ 22 levels "2.76","2.93",..: 16 16 15 5 6 1 7 11 17 17 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num 4 4 1 1 2 1 4 2 2 4 ..
这种行为for
形成对比,在R.大多数其他功能有了一个for循环,评价和内完成它的任务通常生效外for
-loop体,即在调用环境,但该函数调用自身返回NULL . 大多数其他函数在它们的函数体环境之外没有任何效果,如果需要任何持久效果,则需要程序员将返回值分配给命名对象。 (当然,您不应该期望mtcars
的价值会受到该操作的影响。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.