识别数据框中的重复列

Ben*_*ley 17 r dataframe

我是R新手,我正试图从较大的数据框(50K行,215列)中删除重复的列.框架具有离散的连续和分类变量的混合.

我的方法是为框架中的每一列生成一个表到一个列表,然后使用该duplicated()函数在列表中查找重复的行,如下所示:

age=18:29
height=c(76.1,77,78.1,78.2,78.8,79.7,79.9,81.1,81.2,81.8,82.8,83.5)
gender=c("M","F","M","M","F","F","M","M","F","M","F","M")
testframe = data.frame(age=age,height=height,height2=height,gender=gender,gender2=gender)

tables=apply(testframe,2,table)
dups=which(duplicated(tables))
testframe <- subset(testframe, select = -c(dups))
Run Code Online (Sandbox Code Playgroud)

这不是非常有效,特别是对于大型连续变量.但是,我已经走了这条路线,因为我无法使用摘要得到相同的结果(注意,以下假定原始testframe包含重复项):

summaries=apply(testframe,2,summary)
dups=which(duplicated(summaries))
testframe <- subset(testframe, select = -c(dups))
Run Code Online (Sandbox Code Playgroud)

如果您运行该代码,您将看到它只删除找到的第一个副本.我认为这是因为我做错了什么.任何人都可以指出我出错的地方,或者更好的是,我指出了从数据框中删除重复列的更好方法的方向?

koh*_*ske 19

你可以这样做lapply:

testframe[!duplicated(lapply(testframe, summary))]
Run Code Online (Sandbox Code Playgroud)

summary 在忽略订单的同时总结了分布.

不是100%,但如果数据很大,我会使用摘要:

library(digest)
testframe[!duplicated(lapply(testframe, digest))]
Run Code Online (Sandbox Code Playgroud)

  • 除了@kohske建议使用`digest`之外,使用`c`而不是`summary`作为`lapply`函数就足够了. (2认同)
  • 需要注意的是,即使不同,字符向量的摘要也会产生相同的摘要。这是因为对字符向量的摘要仅输出向量的长度 (2认同)

小智 19

怎么样:

testframe[!duplicated(as.list(testframe))]
Run Code Online (Sandbox Code Playgroud)

  • 这是迄今为止我用于在 data.frame 上测试重复项的最快方法 (2认同)

hsh*_*hab 8

您可以使用的一个好技巧是转置您的数据框,然后检查重复项。

duplicated(t(testframe))
Run Code Online (Sandbox Code Playgroud)