Проверьте наличие повторяющейся строки заголовка в данных - PullRequest
0 голосов
/ 03 апреля 2019

Всякий раз, когда я импортирую данные, я хотел бы проверить, есть ли строка, которая является просто повторяющимся заголовком, или это происходит в некоторых столбцах.Я знаю, как сделать это красиво для 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 ]

1 голос
/ 03 апреля 2019

Идея была похожа на Ронак, только по ряду, а не по столбцам.

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 элементов совпадают с именами столбцов.

1 голос
/ 03 апреля 2019

A 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])

ПРИМЕЧАНИЕ. Здесь мы поднастроим столбцы с [[, чтобы избежать издержек на data.table

1 голос
/ 03 апреля 2019

Вы можете зациклить names из data.table и подсчитать количество повторений имен столбцов, используя colSums.

colSums(sapply(names(dt), function(x) dt[,x, with = FALSE] == x))

# mpg  cyl disp   hp drat   wt qsec   vs   am gear carb 
#   1    1    1    1    1    1    1    1    1    1    1 

В этом примере, поскольку у нас есть одна строка для каждого столбца с именем столбца, все значения равны 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...