每当我导入数据时,我都想检查是否有仅仅是重复的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,...)
如果要重复整个标题,或者仅在一列中发生,我想离开。
答案 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])
注意:这是用[[
设置列的子集,以避免数据表开销