比较变量并删除一个具有最低值 R [关闭]

Posted

技术标签:

【中文标题】比较变量并删除一个具有最低值 R [关闭]【英文标题】:compare variables and remove one with lowest value R [closed] 【发布时间】:2015-11-06 22:35:53 【问题描述】:

我有一个包含 45 个变量之间相关性的数据框,并添加了“varImp”函数赋予每个变量的随机森林重要性值(我用这些数据运行了一个随机森林训练模型。

我想遍历每一列,如果变量的相关性超过 0.8(绝对值),删除该行变量或该列变量,以“varImp”重要性较低者为准。我还想从列/行中删除相同的变量(因为它是一个相关矩阵,所有变量都显示在一行和一列中)。

例如,roll_belt 和 max_picth_belt 的相关性约为 .97,并且由于 roll_belt 的值是 3.77,而 max_picth_belt 的值为 3.16,我想将 max_pitch_belt 作为一行和一列删除。

感谢您的帮助!

【问题讨论】:

这听起来像是apply 的工作,但您发布的图片毫无用处。请张贴dput 您的数据而不是图片。 请添加您的实际数据并显示所需的输出。 抱歉,这里是谷歌的数据文档:docs.google.com/spreadsheets/d/… 请把数据放一个dput,这样人们可以用最少的麻烦得到数据。 想要的输出应该是这样的谷歌狗:docs.google.com/spreadsheets/d/… 【参考方案1】:

我相信一定有更直接的方法。不过,我的代码完成了这项工作。

假设,我们已将您的数据集加载到一个名为 df 的对象中(我没有包含用于获取您的数据的代码,因为它不相关)。

首先,我可以方便地拆分数据本身和用于测试功能重要性的value 列。名为 test.value 的新对象是第 46 列。

test.value <- df$value
df <- df[,-ncol(df)] # remove the last column from the dataset

现在我们可以开始了。

框架。我们需要确定要从数据集中删除的行数/列数。所以我们会:

    逐列进行 识别所有大于 0.8 的相关的位置 在嵌套循环中逐一比较特征重要性 记录应在对象中删除的行/列号 remove 最后,删除选定的行/列

代码是:

remove <- c() # a vector to store features to be removed
for(i in 1:ncol(df))
        coli <- df[,i] # pick up i-th column
        highcori <- coli>.8 & coli!=1 # logical vector of cors > 0.8

        # go further only if there are cors > 0.8
        if(sum(highcori,na.rm = T)>0)

        posi <- which(highcori) # identify positions of cors > 0.8

        # compare feature importance one by one
        for(k in 1:length(posi))
                remi <- ifelse(test.value[i]>test.value[posi[k]],posi[k],i)
                remove <- c(remove,remi) # store the less valued feature 
                
        



remove <- sort(unique(remove)) # keep only unique entries

df.clean <- df[-remove,-remove] # finally, clean the dataset

就是这样。


更新 对于那些可以提供更好解决方案的人,这里是易于阅读的数据,cor.remove.RData 或 如果你喜欢dputdput.df.txtdput.test.value.txt

我很想看到解决任务的更好方法。

【讨论】:

感谢您的帮助,对不起,如果我在这篇文章中措辞不佳/没有正确包含数据。您的代码有效,尽管我做了一些编辑。因为它是一个相关矩阵,所以一切都将与自身具有 100% 的相关性,所以我将“highcori”定义更改为highcori &lt;- ifelse(coli&gt;=.8 &amp; coli!= 1, TRUE,FALSE),并在此处添加if(i!=k)if(i!=k) remi &lt;- ifelse(test.value[i]&gt;test.value[posi[k]],posi[k],i) remove &lt;- c(remove,remi) 合理的改进。抱歉,当我更改 NA 的所有自相关时,我忘记在答案中包含步骤。这就是我所做的。当然,像if(coli&gt;=.8 &amp; coli!= 1) 这样的调节更有意义。请注意,您不需要ifelse,因为coli&gt;=.8 &amp; coli!= 1 只会产生所需的输出。

以上是关于比较变量并删除一个具有最低值 R [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭 C 中整数变量的第三个最低有效位? [复制]

根据与向量的比较并在 R [关闭] 中获取最接近的数字来创建列

最低数量比较以找到 3 个数字的中位数

django 项目的最低服务器要求[关闭]

有没有办法在这个 R 代码中进行并行处理?

如何删除R中两列中具有相同值但ID不同的行[重复]