Answers:
将所有零替换为NA:
df[df == 0] <- NA
说明
1.这不是NULL
您要替换零的内容。因为它说的?'NULL'
,
NULL表示R中的空对象
这是唯一的,我想可以看作是最缺乏信息和最空洞的对象。1然后变得不足为奇了
data.frame(x = c(1, NULL, 2))
# x
# 1 1
# 2 2
也就是说,R不会为此空对象保留任何空间。2同时,看着?'NA'
我们看到
NA是长度为1的逻辑常数,其中包含缺失值指示符。NA可以强制为除raw外的任何其他向量类型。
重要的NA
是,长度为1,因此R为其保留了一些空间。例如,
data.frame(x = c(1, NA, 2))
# x
# 1 1
# 2 NA
# 3 2
而且,数据帧结构要求所有列都具有相同数量的元素,以便不存在“空洞”(即NULL
值)。
现在,就可以NULL
完全删除所有包含至少一个零的行的意义上,在数据框中替换零。当使用,例如,var
,cov
,或cor
,实际上等同于第一与替换零NA
和设置的值use
作为"complete.obs"
。但是,通常这不能令人满意,因为这会导致额外的信息丢失。
2.在解决方案中,我没有运行某种循环,而是使用df == 0
矢量化。df == 0
返回(尝试)相同大小的矩阵df
,与所述条目TRUE
和FALSE
。此外,我们还被允许将该矩阵传递给子集[...]
(请参阅参考资料?'['
)。最后,虽然的结果df[df == 0]
非常直观,但看起来却很奇怪,无法df[df == 0] <- NA
达到预期的效果。赋值运算符<-
确实并不总是那么聪明,并且不能以这种方式与某些其他对象一起工作,但对数据帧却是如此。见?'<-'
。
1集理论中的空集感觉上有某种联系。
2与集合理论的另一个相似之处:空集合是每个集合的子集,但我们不为其保留任何空间。
由于有人要求提供此版本的Data.Table,并且由于给定的data.frame解决方案不适用于data.table,因此,我在下面提供了解决方案。
基本上,使用:=
运算符->DT[x == 0, x := NA]
library("data.table")
status = as.data.table(occupationalStatus)
head(status, 10)
origin destination N
1: 1 1 50
2: 2 1 16
3: 3 1 12
4: 4 1 11
5: 5 1 2
6: 6 1 12
7: 7 1 0
8: 8 1 0
9: 1 2 19
10: 2 2 40
status[N == 0, N := NA]
head(status, 10)
origin destination N
1: 1 1 50
2: 2 1 16
3: 3 1 12
4: 4 1 11
5: 5 1 2
6: 6 1 12
7: 7 1 NA
8: 8 1 NA
9: 1 2 19
10: 2 2 40
for (j in names(DT)); set(DT,which(DT[[j]] == 0),j,NA)
。有关使用data.table查找和替换值的更详细讨论,请参见此处。
您只能在数字字段(例如,排除因子之类的东西)中替换0
为NA
,但它可以逐列工作:
col[col == 0 & is.numeric(col)] <- NA
使用功能,您可以将其应用于整个数据框:
changetoNA <- function(colnum,df) {
col <- df[,colnum]
if (is.numeric(col)) { #edit: verifying column is numeric
col[col == -1 & is.numeric(col)] <- NA
}
return(col)
}
df <- data.frame(sapply(1:5, changetoNA, df))
尽管您可以将替换为1:5
数据框中的列数或1:ncol(df)
。
1:5
与1:ncol(df)
结尾。我不想使方程过于复杂或难以阅读。
1:5
改为要更改的列号,例如12:15
,但是如果要确认它只会影响数字列,则只需将函数的第二行包装在if语句中,如下所示:if (is.numeric(col)) { col[col == -1 & is.numeric(col)] <- NA }
。