【问题标题】:Identifying incorrectly transformed data cells识别错误转换的数据单元
【发布时间】:2016-03-27 01:32:56
【问题描述】:

我有一个巨大的 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),它会给出行号。这很容易,因为我已经知道它是哪一列了。

我的问题是,我怎样才能对整个数据框执行相同的操作,以便同时获得故障单元格的行号和列号?。

【问题讨论】:

  • 您是否有多个包含日期的列?如果是这样,您可以使用 apply 在所有列上运行 which 函数。例如apply(df, 2, function(x) which(x<1900)) 这将返回与每列对应的结果列表,其中包含错误的索引。
  • @jalapic 谢谢,这就是我要找的。唯一的不便之处是,当日期输入正确时,它会返回每列的名称,并输出integer(0),或者如果输入不正确(我上面的例子),例如[1] 239。它工作得很好,但如果有大量的列,我可以看到这个输出变得很麻烦。
  • 它应该保留列顺序。因此,您可以像 mycolnames <- colnames(df) 这样保存原始列名称,然后当您拥有正确的数据时,只需像这样将它们放回去 colnames(df) <-mycolnames
  • @jalapic 这不是问题,问题是如果我有 50 个带有日期的列,它会返回所有这些列,而不是选择具有错误条目的列:$date.1 integer(0) $date.2 integer(0) $date.3 integer(0) $date.4 integer(0) $date.5 integer(0) $date.6 integer(0) $date.7 integer(0) $date.8 integer(0) $date.9 [1] 3 。所以理想情况下,我希望它跳过前 8 列,然后将我拉到列 date.9。你为什么不输入你的解决方案作为一个单独的答案
  • 已经这样做了——如果有帮助,请告诉我。没有可重复的数据,很难做一个确切的例子。

标签: r


【解决方案1】:

开始于:

  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

【讨论】:

  • 谢谢,但数据框有一些因子列,所以我宁愿避免子集和转换它并使用上述响应。
【解决方案2】:

一个潜在的解决方案

使用apply识别所有错误

results &lt;- apply(df, 2, function(x) which(x&lt;1900))

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

results[lapply(results,length)&gt;0]

【讨论】:

    猜你喜欢
    • 2018-07-13
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多