识别错误转换的数据单元格

时间:2016-03-27 01:32:57

标签: r

我有一个大量的excel电子表格,其中包含%m/%d/%Y格式的日期。在R中,我使用as.Date转换它们的日期格式。问题是Excel中的某些日期是手动输入错误的,例如下面的部分中输入的是214而不是2014年。

...
235     2014-01-20
236     2014-03-03
237     2014-01-24
238     2014-03-07
239      214-05-23
240     2014-01-31
241     2014-02-19
242     2014-03-27
...

对于单个列,我可以使用函数which(dataframe$colname_X<1900),它将为我提供行号。这很容易,因为我已经知道它是哪一列。

我的问题是,如何对整个数据框执行相同的操作,以便获取有故障单元格的行号和列号?

2 个答案:

答案 0 :(得分:2)

从:

开始
  dat <- rd.txt("235     2014-01-20  # #function to use read.table on text
 236     2014-03-03
 237     2014-01-24
 238     2014-03-07
 239      214-05-23
 240     2014-01-31
 241     2014-02-19
 242     2014-03-27")
 dat <- cbind(dat,dat)
 dat[] <- lapply(dat, as.Date, origin="1970-01-01")
> dat
        X235 X2014.01.20       X235 X2014.01.20
1 1970-08-25  2014-03-03 1970-08-25  2014-03-03
2 1970-08-26  2014-01-24 1970-08-26  2014-01-24
3 1970-08-27  2014-03-07 1970-08-27  2014-03-07
4 1970-08-28  0214-05-23 1970-08-28  0214-05-23
5 1970-08-29  2014-01-31 1970-08-29  2014-01-31
6 1970-08-30  2014-02-19 1970-08-30  2014-02-19
7 1970-08-31  2014-03-27 1970-08-31  2014-03-27

现在使用which和arr.ind = TRUE(首先需要转换为数字矩阵)

which( sapply(dat,as.numeric) < (as.numeric(as.Date("1900-01-01") ) ), arr.ind=TRUE)
     row col
[1,]   4   2
[2,]   4   4

答案 1 :(得分:1)

一种可能的解决方案

使用apply

识别所有错误

results <- apply(df, 2, function(x) which(x<1900))

这将返回一个列表,其中每列都作为列表的元素。由于您不关心那些空的(即没有错误),您可以签订合同以仅保留那些有错误的列表:

results[lapply(results,length)>0]