我在R中加载了一个数据框(dcc),并将其缩小到完整的案例。
str(dcc)
'data.frame': 41715 obs. of 9 variables:
$ XCoord : num 661382 661412 661442 661472 661502 ...
$ YCoord : num 648092 648092 648092 648092 648092 ...
$ OBJECTID : int 1 2 3 4 5 6 7 8 9 10 ...
$ POINTID : int 1 2 3 4 5 6 7 8 9 10 ...
$ GRID_CODE : int 0 0 0 0 0 0 0 0 0 0 ...
$ APPL_COST_DIST_RIV_COAST: num 21350 21674 22185 22748 23448 ...
$ APPL_DEM30 : int 785 793 792 769 765 777 784 789 781 751 ...
$ APPL_DEM30_SLOPE : num 19.7 13.3 18.6 23.2 21 ...
$ APPL_SITE_NONSITE : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
我希望通过减去均值并除以标准差来标准化数值和整数变量。当我应用以下代码时,我无意中从数据框中删除了因子变量APPL_SITE_NONSITE:
ind <- sapply(dcc, is.numeric)
dcc.s<-sapply(dcc[,ind], function(x) (x-mean(x))/sd(x))
dcc.s<-data.frame(dcc.s)
如果我没记错的话,那是因为该变量的ind=FALSE。似乎我需要一些for循环和if/else语句的组合来标准化数字变量并保留因子变量。我尝试了许多排列组合,但总是出现错误。例如,以下代码:
dcc.s <- for (i in 1:ncol(dcc)){ sapply(dcc[,i],
if (is.numeric(dcc[,i])==TRUE) {
function(x) (x-mean(x))/sd(x) }
else {dcc[,i]})
}
返回错误信息:
match.fun(FUN) 函数出错: c("'if (is.numeric(dcc[, i]) == TRUE) {' 不是函数、字符或符号", "' function(x) (x - mean(x))/sd(x)' 不是函数、字符或符号", "'} else {' 不是函数、字符或符号", "' dcc[, i]' 不是函数、字符或符号", "'}' 不是函数、字符或符号")
也许这只是一个简单的格式错误或括号放错了位置,但我被卡住了。如果有更优雅的方法来解决问题,我也愿意尝试。非常感谢任何帮助。
is.numeric(as.integer(10))
将返回TRUE
,因此这也可以缩放int
。 - Maurits Evers