R 数据表就地更换不起作用
我正在尝试使用以下代码替换非数字和逻辑列中的NAs:R 数据表就地更换不起作用,r,data.table,R,Data.table,我正在尝试使用以下代码替换非数字和逻辑列中的NAs: test_dt <- data.table(a = c("foo", "bar", "foo_bar"), b = c(1.243, NA, 78454), c = c(NA, NA, NA), d = c(1.242345235, 2.3453255635, 475.253552352),
test_dt <- data.table(a = c("foo", "bar", "foo_bar"),
b = c(1.243, NA, 78454),
c = c(NA, NA, NA),
d = c(1.242345235, 2.3453255635, 475.253552352),
e = as.POSIXlt(c(NA, rep(Sys.time(), 2)), origin = as.POSIXlt(Sys.time(), "GMT"), tz = "GMT"),
f = c(T, F, NA),
g = as.Date(c(Sys.Date(), Sys.Date() - 5, NA)))
replaceNABlank <- function(DT, cols) {
for (j in cols)
set(DT,which(is.na(DT[[j]])) ,j, '')
print(DT)
}
to_quote <- names(test_dt)[!(sapply(test_dt, class) %in% c('logical', 'numeric', 'integer'))]
options(useFancyQuotes = FALSE)
test_dt <- test_dt[, (to_quote) := lapply(.SD, as.character), .SDcols = to_quote]
test_dt1 <- replaceNABlank(test_dt, to_quote)
test\u dt我认为问题在于函数的返回值。您可以使用print(DT)
,但如果要指定实际结果,只需返回DT
。因此,一种方法是将函数更改为:
replaceNABlank <- function(DT, cols) {
for (j in cols)
set(DT,which(is.na(DT[[j]])) ,j, '')
DT
}
@Frank你是对的,当你分配print
返回值时,它不会做任何事情。他们还可以将函数更改为返回DT
,这将与Ok一起工作。即使最后一行有DT
,也没有理由使用@Frank,我可能误解了你的意思,但你是说你可以更改函数以删除DT
,然后OPs原始代码应该可以工作?我意识到,对于第二种方法,不需要从函数返回DT
,但我认为它太混乱,无法包含函数的一个小变化。我刚才说“这将与一起工作”。啊,是的,你是对的,这是我愚蠢的建议。谢谢你的帮助!
test_dt[, (to_quote) := lapply(.SD, as.character), .SDcols = to_quote]
replaceNABlank(test_dt, to_quote)
test_dt
# a b c d e f g
#1: foo 1.243 NA 1.242345 TRUE 2018-05-09
#2: bar NA NA 2.345326 2066-09-15 06:43:38 FALSE 2018-05-04
#3: foo_bar 78454.000 NA 475.253552 2066-09-15 06:43:38 NA