我正在尝试编写一些R代码,它将采用虹膜数据集并根据某些标准对数字列进行对数转换,例如,如果偏斜> 0.2。我曾尝试使用ldply,但它并不能完全满足我想要的输出。它给了我一个转置数据框,缺少变量名,并且非数字列条目搞砸了。
在发布此问题之前,我搜索并找到了以下相关主题,但并不完全符合我的目的
Selecting only numeric columns from a data frame
extract only numeric columns from data frame 数据
以下是代码。感谢帮助!
data(iris)
df <- iris
df <- ldply(names(df), function(x)
{
if (class(df[[x]])=="numeric")
{
tmp <- df[[x]][!is.na(df[[x]])]
if (abs(skewness(tmp)) > 0.2)
{
df[[x]] <- log10( 1 + df[[x]] )
}
else df[[x]] <- df[[x]]
}
else df[[x]] <- df[[x]]
#df[[x]] <- data.frame(df[[x]])
#df2 <- cbind(df2, df[[x]])
#return(NULL)
}
)
答案 0 :(得分:0)
尝试lapply
:
#Skewness package
library(e1071)
lapply(iris, function(x) {
if(is.numeric(x)){
if(abs(skewness(x, na.rm = T))>0.2){
log10(1 + x)} else x
}
else x
})
答案 1 :(得分:0)
我们可以使用lapply
library(e1071)
lapply(iris, function(x) if(is.numeric(x) & abs(skewness(x, na.rm = TRUE)) > 0.2)
log10(1+x) else x)
我们还可以在创建逻辑索引
后循环感兴趣的列i1 <- sapply(iris, is.numeric)
i2 <- sapply(iris[i1], function(x) abs(skewness(x, na.rm = TRUE)) > 0.2)
iris[i1][i2] <- lapply(iris[i1][i2], function(x) log10(1+x))