我不知道是否曾经问过这个问题,所以我想继续张贴它。
我有一个看起来像这样的数据框:
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))