我有一个大量的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)
,它将为我提供行号。这很容易,因为我已经知道它是哪一列。
我的问题是,如何对整个数据框执行相同的操作,以便获取有故障单元格的行号和列号?
答案 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]