我想编写一个函数,该函数根据特征的度量范围(连续,二分或有序)动态使用不同的相关方法。标签始终是连续的。我的想法是使用apply()函数,以便遍历每个功能(又称列),检查其度量范围(数字,具有两个级别的因数,具有两个以上级别的因数),然后使用适当的相关函数。不幸的是,我的代码似乎将每个功能都转换为字符向量,因此if语句中的条件对于每一列始终为false。我不知道为什么我的代码正在这样做。如何防止代码将特征转换为字符向量?
set.seed(42)
foo <- sample(c("x", "y"), 200, replace = T, prob = c(0.7, 0.3))
bar <- sample(c(1,2,3,4,5),200,replace = T,prob=c(0.5,0.05,0.1,0.1,0.25))
y <- sample(c(1,2,3,4,5),200,replace = T,prob=c(0.25,0.1,0.1,0.05,0.5))
data <- data.frame(foo,bar,y)
features <- data[, !names(data) %in% 'y']
dyn.corr <- function(x,y){
# print out structure of every column
print(str(x))
# if feature is numeric and has more than two outcomes use corr.test
if(is.numeric(x) & length(unique(x))>2){
result <- corr.test(x,y)[['r']]
} else {
result <- "else"
}
}
result <- apply(features,2,dyn.corr,y)
答案 0 :(得分:3)
apply
是为矩阵构建的。当您apply
到数据帧时,首先发生的是将数据帧强制为矩阵。矩阵只能具有一种数据类型,因此,发生这种情况时,数据的所有列都将转换为其中最通用的类型。
使用sapply
或lapply
处理数据框的列。
这应该可以正常工作(我尝试进行测试,但是我不知道要加载哪个软件包才能获得corr.test
函数。)
result <- sapply(features, dyn.corr, income)