识别数据框中的重复列

时间:2012-03-22 06:31:35

标签: 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))

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

summaries=apply(testframe,2,summary)
dups=which(duplicated(summaries))
testframe <- subset(testframe, select = -c(dups))

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

9 个答案:

答案 0 :(得分:19)

您可以使用lapply

testframe[!duplicated(lapply(testframe, summary))]

summary在忽略订单的同时总结了分配。

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

library(digest)
testframe[!duplicated(lapply(testframe, digest))]

答案 1 :(得分:16)

怎么样:

if ( ( $.trim( $('form#commentform input#author').val() )  != '' ) ) {
        $('p#something').append("<span>Please enter name</span>");
    }

答案 2 :(得分:3)

unique(testframe, MARGIN=2) 

不起作用,但我认为应该这样,所以试试

as.data.frame(unique(as.matrix(testframe), MARGIN=2))

或者如果您担心数字变成因素,

testframe[,colnames(unique(as.matrix(testframe), MARGIN=2))]

产生

   age height gender
1   18   76.1      M
2   19   77.0      F
3   20   78.1      M
4   21   78.2      M
5   22   78.8      F
6   23   79.7      F
7   24   79.9      M
8   25   81.1      M
9   26   81.2      F
10  27   81.8      M
11  28   82.8      F
12  29   83.5      M

答案 3 :(得分:3)

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

duplicated(t(testframe))

答案 4 :(得分:0)

如果数据框的重复列具有相同的名称,这是一个简单的命令:

testframe[names(testframe)[!duplicated(names(testframe))]]

答案 5 :(得分:0)

最好是首先找到重复的列名并进行相应的处理(例如,将两个值相加,取均值,第一,最后,第二,模式等)。查找重复的列: / p>

names(df)[duplicated(names(df))]

答案 6 :(得分:0)

如果问题是数据帧已使用太多次合并,例如:

    testframe2 <- merge(testframe, testframe, by = c('age'))

从列名中删除.x后缀也很好。我在Mostafa Rezaei的出色答案之上应用了此方法:

    testframe2 <- testframe2[!duplicated(as.list(testframe2))]
    names(testframe2) <- gsub('.x','',names(testframe2))

答案 7 :(得分:0)

那又怎么样:

unique.matrix(testframe, MARGIN=2) 

答案 8 :(得分:-1)

实际上你只需要反转代码中的重复结果,并且可以坚持使用subset(与括号表示法相比,它更具可读性)

require(dplyr)
iris %>% subset(., select=which(!duplicated(names(.))))