处理data.table中的'错误'条目和NA,用其他表中的条目替换它们

问题描述 投票:0回答:1

我正在使用Shiny和handsontable.js在更广泛的应用程序上下文中使用data.table。这是应用程序此部分的流程:

  1. 我使用handsontable&Shiny在具有数字列的浏览器上发布了一个data.table。这在屏幕上呈现。
  2. 用户更改值,并且每次发生这种情况时,都会返回一个新的data.table,并随数据一起返回。

问题出在错误管理上,特别是如果用户不小心键入了字符。

我的目标是纠正用户的错误,用原始副本中的值替换输入字符的单个单元格值(仅此单元格,因为其他单元格可能包含要在应用程序的稍后阶段保存的有效更改)。

可悲的是,我无法找到有效的解决方案。这是我的代码和可复制的示例:

# I generate a sample datatable
originTable = data.table( Cat = LETTERS[1:5],
Jan=1:5,
Feb=sample(1:5),
Mar=sample(1:5),
Apr=sample(1:5),
May=sample(1:5))

# I take a full copy & to simulate the effect of a character key in by mistake I convert
# the entire column to character
dt_ <- copy(originTable)
dt_[,Jan := as.character(Jan)]

# "q" entered by mistake by the user - 
dt_[[5,2]] <- "q"

# This is what I get back:
   Cat Jan Feb Mar Apr May
1:   A   1   1   2   4   4
2:   B   2   5   4   2   2
3:   C   3   4   3   1   5
4:   D   4   3   5   5   1
5:   E   q   2   1   3   3

现在通过我的代码尝试解决此问题:

valCols <- month.abb[1:5]
for (j in  valCols)
      set(dt_,  
        i = NULL,
        j = j, 
        value= as.numeric(as.character(dt_[[j]])))

这给了我一个data.table,它的NA值在某处(代替错误输入的字符-我忽略的位置)。

为替换值,我使用了下面的代码

for (j in  valCols)
   set(dt_,  
    i = which(is.na(dt_[[j]])),
    j = j, 
    value= as.numeric(originTable[[j]]))

但是它不起作用:它找到正确的列,但忽略i值并复制originTable[1,j]中包含的值,而不是originTable[i,j]。在示例中,dt_ [5,2]将得到1(定位为originTable [1,2]而不是5。

换句话说,我期望看到as.numeric(originTable[[j]])i(隐式)和j(显式)子集。公平地讲,警告告诉我正在发生的事情:

Warning message:
In set(dt_, i = which(is.na(dt_[[j]])), j = j, value = as.numeric(originTable[[j]])) :
  Supplied 5 items to be assigned to 1 items of column 'Jan' (4 unused)

但是我仍然没有解决我的问题。

我读了无数表面上类似的SO帖子,但可悲的是没有用(可能是因为NA处理在最近的版本中有所发展,并且较旧的答案已不再完全反映最佳实践)。同样,基于非NA的解决方案同样可以接受。谢谢

r data.table na
1个回答
0
投票

尝试以下操作:

# use your criteria to determine what the incorrect values are in each column
wrongs = lapply(dt_[, !"Cat"], function(x) which(is.na(as.numeric(x))))

# now substitute
for (n in names(wrongs)) dt_[wrongs[[n]], (n) := originTable[[n]][wrongs[[n]]]]

dt_
#   Cat Jan Feb Mar Apr May
#1:   A   1   2   5   2   4
#2:   B   2   4   3   4   5
#3:   C   3   3   2   5   2
#4:   D   4   1   1   1   1
#5:   E   5   5   4   3   3
© www.soinside.com 2019 - 2024. All rights reserved.