在尝试替换data.frame
中的NA时,我发现data.table::set()
的行为很奇怪。我不习惯使用data.table
语法,但是set()
也应该适用于data.frame
。
以下代码显示了问题:
set.seed(123)
data <- data.frame(replicate(5,sample(c(1,NA),5,rep=TRUE)))
dt <- as.data.table(data)
dt_red <- dt[-1, -2]
df <- data
df_red <- df[-1, -2]
sum(is.na(data))
sum(is.na(dt))
sum(is.na(dt_red))
sum(is.na(df))
sum(is.na(df_red))
ind <- as.integer(c(2,3))
for (j in ind)
set(data,which(is.na(data[[j]])),j,0)
sum(is.na(data))
sum(is.na(dt))
sum(is.na(dt_red))
sum(is.na(df))
sum(is.na(df_red))
该函数应该用0替换数据中第2列和第3列中的NA。它也替换了df中的NA,这实际上是不应该的。如果将数据安全地保存为data.table或对其进行修改,则什么都不会改变...
有什么想法吗?
P.S。
这篇文章不是关于如何更改脚本以使其正常工作(我做到了),而是帮助我意识到如何set()
被允许更改df
,而只被赋予data
一起工作?