我不知道是否曾经问过这个问题,所以我想继续张贴它。
我有一个看起来像这样的数据框:

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不匹配,因为它实际上不存在,并且对角线上有一个断点。由于表格式是为了使任何人都可以使用而设计的,因此输入值的人显然犯了重大错误。

唯一的目标是找到对角线中列不正确的所有值,并打破对角线。我要清除这些。例如,2012-2016年在C05(列)下的C06行(在县代码下)为零。输出可能只是这样的简单列表:[1] C05,C40, ...,所以我可以找到这些离群值并更好地定位它们。

关键是要在列中找到错误的县。

PS:每年大约有65(行)x 75(列),虽然我可以尝试手动进行操作,但我想对其进行编码,以便可以进一步使用。

谢谢!

最佳答案

使用data.table -package的可能解决方案:

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

08-20 00:20