【发布时间】:2021-08-09 07:58:45
【问题描述】:
[数据表] 如果列是数字,我已经编写了一个这样的函数来将 NA 替换为 0
fn.naremove <- function(data){
for (i in 1: length(data)){
if (class(data[[i]]) %in% c("numeric", "interger", "interger64")) {
print(data[, names(data[, i]) := replace(data[, i], is.na(data[, i]), 0)])
}
else {
print(data)
}}}
我有一个如下所示的示例数据表
dt1<- data.table(C1= c(1, 5, 14, NA, 54), C2= c(9, NA, NA, 3, 42), C3= c(9, 7, 42, 87, NA))
如果我使用fn.naremove(dt1)
它返回错误
Error in `[.data.table`(data, , i) :
j (the 2nd argument inside [...]) is a single symbol but column name 'i' is not found.
Perhaps you intended DT[, ..i]. This difference to data.frame is deliberate and explained in FAQ 1.1.
如果我使用实际的列索引运行代码,它会顺利运行并返回我想要的列号 1 的结果:
dt1[, names(dt1[, 1]) := replace(dt1[, 1], is.na(dt1[, 1]), 0)]
C1 C2 C3
1: 1 9 9
2: 5 NA 7
3: 14 NA 42
4: 0 3 87
5: 54 42 NA
如果我错过了我的功能或做错了什么,请告诉我。 提前致谢!!
【问题讨论】:
-
为什么要在函数中打印?
-
我搜索了stackoverflow,了解到如果你想让你的代码在里面工作,你需要把print()放到它上面。因为您将在 R 控制台中看到结果打印出来。
标签: r function for-loop if-statement data.table