使用R&;将\\N替换为NA;数据表或配置单元

使用R&;将\\N替换为NA;数据表或配置单元,r,hive,data.table,R,Hive,Data.table,我在表格中有一些数据: V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 1. 14342667 4336 1.5 2015-10-03 \\N 2015-10-03 804 2.0 2.0 0 3.0 2. 14342667 4336 0.8 2015-06-13 \\N 2015-06-11 2912 2.0 2.0 0 \\N 3. 14342667 4336 0.5 2016-01-0

我在表格中有一些数据:

          V1   V2  V3         V4  V5         V6   V7  V8  V9 V10 V11
 1. 14342667 4336 1.5 2015-10-03 \\N 2015-10-03  804 2.0 2.0   0 3.0
 2. 14342667 4336 0.8 2015-06-13 \\N 2015-06-11 2912 2.0 2.0   0 \\N
 3. 14342667 4336 0.5 2016-01-02 \\N 2015-12-27 1618 0.0 0.0   1 \\N
 4. 14342667 4336 0.7 2015-08-22 \\N 2015-08-22 1780 2.0 2.0   0 \\N
 5. 14342667 4336 0.9 2015-02-21 1.2 2015-02-17 1548 0.0 0.0   1 \\N
 6. 14342667 4336 1.0 2015-08-08 \\N 2015-08-06 1538 2.0 2.0   0 2.25
 7. 14342667 4336 0.9 2015-03-28 \\N 2015-03-24 2129 7.0 7.0   0 \\N
 8. 14342667 4336 0.8 2015-04-11 \\N 2015-04-11 2316 1.0 2.0   0 \\N
我想使用R和data.table将
\\N
的实例替换为NA。当我将数据放入配置单元时,我在空白处得到了这些


我尝试过类似于
data1的方法,我们可以通过
grep
找到具有这种模式的列,然后在这些列上使用
as.numeric

library(data.table)
nm1 <- names(df1)[colSums(sapply(df1, grepl, pattern = "\\\\"))!=0]
setDT(df1)[,(nm1):= lapply(.SD, as.numeric) , .SDcols= nm1]
df1
#         V1   V2  V3         V4  V5         V6   V7 V8 V9 V10  V11
#1: 14342667 4336 1.5 2015-10-03  NA 2015-10-03  804  2  2   0 3.00
#2: 14342667 4336 0.8 2015-06-13  NA 2015-06-11 2912  2  2   0   NA
#3: 14342667 4336 0.5 2016-01-02  NA 2015-12-27 1618  0  0   1   NA
#4: 14342667 4336 0.7 2015-08-22  NA 2015-08-22 1780  2  2   0   NA
#5: 14342667 4336 0.9 2015-02-21 1.2 2015-02-17 1548  0  0   1   NA
#6: 14342667 4336 1.0 2015-08-08  NA 2015-08-06 1538  2  2   0 2.25
#7: 14342667 4336 0.9 2015-03-28  NA 2015-03-24 2129  7  7   0   NA
#8: 14342667 4336 0.8 2015-04-11  NA 2015-04-11 2316  1  2   0   NA
库(data.table)

nm1根据@akrun的建议,这里有另一个简单的方法:

ccols = which(sapply(DF, class) == "character")
DF[ccols] <- lapply(DF[ccols], type.convert, na.strings="\\\\N")

NULL
位于Hive内部,HDFS看起来像
//N
,因此如果要寻找Hive侧解决方案,也可以使用函数
nvl()
进行替换

@Frank,这与我创建的示例非常吻合
setDT(df1)[,lapply(.SD,function(x)type.convert(as.character(x),na.strings=“\\\\N”)]
@Frank您可以将其作为一种解决方案发布,因为这是一种完全不同的方法。@akrun Frank:谢谢您的建议,事实上,您的建议是相辅相成的。akrun的解决方案对数字和frank的字符解决方案都很好。我已经成功地测试了akrun的解决方案,但是(尽管在逻辑上是令人信服的)frank建议的解决方案在性格方面有一些问题。我很抱歉没有更早地输出数据,请在下面的评论中找到它。@frank这是数据的输出:结构(列表(MDSE_ITEM_I=c(14342667,14342667,14342667,14342667,14342667,14342667,14342667),WK_BASE_IDX_Q=c(1.5,0.8,0.5,0.7,0.9,0.8),WK_END_D=结构(c)(16711165991680216669164871665516522516536),class=“Date”),SLS_TYPE_GRP_C=C(\\N”,“\\N”,“\\N”,“\\N”,“\\N”,“\\N”,“\\N”,“\\N”,“内部行,\\N”),.Names=C(“MDSE_ITEM_I”,“WK_BASE_IDX_Q”,“WK_END_D”,“SLS_TYPE_GRP_C”),class=C(“data.table”,“data.frame”,“data.frame”,“internal.ref”=,“\\N”),“\\N”),“\\N.”行,\\N
ccols = which(sapply(DF, class) == "character")
DF[ccols] <- lapply(DF[ccols], type.convert, na.strings="\\\\N")
library(data.table)
setDT(DF)
ccols = which(sapply(DF, class) == "character")
DF[, (ccols) := lapply(.SD, type.convert, na.strings="\\\\N"), .SDcols=ccols]