Найти все нули по диагонали фрейма данных - PullRequest
0 голосов
/ 18 мая 2018

Я не знаю, задавался ли этот вопрос раньше, поэтому я хотел продолжить и опубликовать его.У меня есть фрейм данных, который выглядит следующим образом:

YEAR    CountyCode         C01   C02 C03 C04 C05 C06 . . .  
2012    C01                132    0   3   1   4   9 
2012    C02                 0    21   0   57  0   0 
2012    C03                 0    0   56   0  1    1
2012    C04                 0    6    0  40 0    26 
2012    C06                 0    0    1   0  0    0 
2012    C07                 0    0    1  32  219  6
.        .      
.        .
.        .
2013    C01                220    9   2   4   0   0 
2013    C02                 0    54   0   62  0   2 
2013    C03                 0    0   24   0   1   1
2013    C04                 0    6    0  224  0   2 
2013    C06                 0    0    2   0   0   0 
2013    C07                 0    0    1  37   2   3

И так далее в течение 5 лет данных.Каждый год связан с 75 столбцами с записями «C0x», связанными с определенным «C0x» в коде графства.В основном это своего рода матрица плательщиков.

Все строки в CountyCode правильные (их около 65 правильных), в то время как вертикальные столбцы не все правильные.Существуют очень конкретные коды округов (например, 1,2,3,4,6 и т. Д.).

Итак, как вы можете видеть, C05 не соответствует C05, потому что его на самом деле не существует,и есть разрыв по диагонали.Поскольку формат таблицы был составлен таким образом, чтобы каждый мог использовать его, тот, кто ввел значения, очевидно, допустил серьезные ошибки.

Единственная цель - найти все значения на диагонали , гдестолбцы неверны и ломают диагональ.Я хочу отсеять это.например, в соответствии с C05 (столбец) и строка C06 (в соответствии с Кодексом округа) равна нулю на 2012–2016 годы.Выводом может быть простой список, подобный следующему: [1] C05,C40, ..., чтобы я мог найти эти выбросы и расположить их лучше.

Смысл в том, чтобы найти неправильные графства в столбцах.

PS: Есть около 65 (строки) x 75 (столбцы) для каждого года , и хотя я могу попробовать сделать это вручную, я хотел бы закодировать его, чтобы его можно было использовать в дальнейшем.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

В базе R, чтобы увидеть, какие столбцы не в df$CountyCode, вы можете сделать

names(df[,c(-1,-2)])[!(names(df[,c(-1,-2)]) %in% df$CountyCode)]

Если вы просто хотите сохранить столбцы, которые в df$CountyCode, возможно, вы можете сделать что-то вроде

library(tidyverse)
correct <- names(df[,c(-1,-2)])[names(df[,c(-1,-2)]) %in% df$CountyCode]
df %>% select(1,2, correct)
0 голосов
/ 18 мая 2018

Вот решение Base R:

do.call(rbind, lapply(split(df, df$YEAR), function(x){
  Column = as.matrix(x[,-(1:2)])
  Row = x$CountyCode
  data.frame(Column = colnames(Column)[diag(Column) == 0],
             Row = Row[diag(Column) == 0])
}))

Результат:

     Column Row
2012    C05 C06
2013    C05 C06

Данные:

df <- structure(list(YEAR = c(2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L),
                     CountyCode = c("C01", "C02", "C03", "C04", "C06", "C07", "C01", "C02", "C03", "C04", "C06", "C07"),
                     C01 = c(132L, 0L, 0L, 0L, 0L, 0L, 220L, 0L, 0L, 0L, 0L, 0L),
                     C02 = c(0L, 21L, 0L, 6L, 0L, 0L, 9L, 54L, 0L, 6L, 0L, 0L),
                     C03 = c(3L, 0L, 56L, 0L, 1L, 1L, 2L, 0L, 24L, 0L, 2L, 1L),
                     C04 = c(1L, 57L, 0L, 40L, 0L, 32L, 4L, 62L, 0L, 224L, 0L, 37L),
                     C05 = c(4L, 0L, 1L, 0L, 0L, 219L, 0L, 0L, 1L, 0L, 0L, 2L),
                     C06 = c(9L, 0L, 1L, 26L, 0L, 6L, 0L, 2L, 1L, 2L, 0L, 3L)),
                .Names = c("YEAR", "CountyCode", "C01", "C02", "C03", "C04", "C05", "C06"), class = "data.frame", row.names = c(NA, -12L))
0 голосов
/ 18 мая 2018

Возможное решение с использованием пакета data.table:

library(data.table)
setDT(df)

df[, .(cols_not_in_rows = setdiff(names(.SD)[-1], CountyCode),
       rows_not_in_cols = setdiff(CountyCode, names(.SD)[-1]))
   , by = YEAR]

, который дает:

   YEAR cols_not_in_rows rows_not_in_cols
1: 2012              C05              C07
2: 2013              C05              C07

Используемые данные:

df <- structure(list(YEAR = c(2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L),
                     CountyCode = c("C01", "C02", "C03", "C04", "C06", "C07", "C01", "C02", "C03", "C04", "C06", "C07"),
                     C01 = c(132L, 0L, 0L, 0L, 0L, 0L, 220L, 0L, 0L, 0L, 0L, 0L),
                     C02 = c(0L, 21L, 0L, 6L, 0L, 0L, 9L, 54L, 0L, 6L, 0L, 0L),
                     C03 = c(3L, 0L, 56L, 0L, 1L, 1L, 2L, 0L, 24L, 0L, 2L, 1L),
                     C04 = c(1L, 57L, 0L, 40L, 0L, 32L, 4L, 62L, 0L, 224L, 0L, 37L),
                     C05 = c(4L, 0L, 1L, 0L, 0L, 219L, 0L, 0L, 1L, 0L, 0L, 2L),
                     C06 = c(9L, 0L, 1L, 26L, 0L, 6L, 0L, 2L, 1L, 2L, 0L, 3L)),
                .Names = c("YEAR", "CountyCode", "C01", "C02", "C03", "C04", "C05", "C06"), class = "data.frame", row.names = c(NA, -12L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...