检查数据中是否有重复的标题行

时间:2019-04-03 12:30:12

标签: r data.table data-cleaning

每当我导入数据时,我都想检查是否有仅仅是重复的Header的行,或者是否在某些列中发生了这种情况。我知道如何很好地处理NA或空值,而不仅限于列名。

library(data.table)
dt<-data.table(mtcars)
dt2<-data.table(t(names(dt)))
names(dt2)<-names(dt)
dt<-rbind(dt,dt2)

我基本上将名称添加为最后一个列,我想分别针对整行和每一列进行检查,以查看导入未知数据时是否存在问题。

colSums(dt[,lapply(.SD,is.na)])
colSums(dt[,lapply(.SD,function(x) x=="")])

它在这里适用于NA和空白单元格,以告诉我这是一个问题的频率。 但是我不知道如何检查重复的标题。

colSums(dt[,lapply(.SD,function(x) x==.SD)])

最后一行不起作用,因为它只是将列与其自身进行比较,但是将.SD的列名放在此处(mpg,...)

如果要重复整个标题,或者仅在一列中发生,我想离开。

3 个答案:

答案 0 :(得分:1)

您可以在names的{​​{1}}上循环,并使用data.table计算重复列名称的次数。

colSums

在该示例中,由于每一列都有一行,每列的名称均为1。

答案 1 :(得分:1)

具有与Ronak相似的想法,只是逐行而不是按列。

result <- do.call(rbind, lapply(1:nrow(dt), function(x) dt[x,] == names(dt)))
rowSums(result)

> rowSums(result)
 [1]  0  0  0  0  0  0  0  0  0  0  0  0  0  0  
      0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 11

因此,在最后一行,有11个元素与其列名称匹配。

答案 2 :(得分:1)

一个data.table选项将会

dt[, Map(function(x, y) sum(x == y), .SD, names(.SD))]
#   mpg cyl disp hp drat wt qsec vs am gear carb
#1:   1   1    1  1    1  1    1  1  1    1    1

或与colSums

dt[, colSums(mapply(`==`, .SD, names(.SD)))]
#   mpg  cyl disp   hp drat   wt qsec   vs   am gear carb 
#    1    1    1    1    1    1    1    1    1    1    1 

此外,如果我们使用for循环,则另一个选择是

v1 <- numeric(length(dt))
for(i in seq_along(dt)) v1[i] <- sum(dt[[i]] == names(dt)[i])

注意:这是用[[设置列的子集,以避免数据表开销