将所有0值替换为NA

时间:2012-06-14 16:03:13

标签: r

我有一些带有一些数字列的数据框。某些行具有0值,在统计分析中应将其视为空值。在R中将所有0值替换为NULL的最快方法是什么?

9 个答案:

答案 0 :(得分:194)

将所有零替换为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替换零,从而完全删除包含至少一个零的所有行。使用时,例如varcovcor,实际上相当于首先用NA替换零并将use的值设置为{ {1}}。然而,通常情况下,这是不能令人满意的,因为它会导致额外的信息丢失。

2。在解决方案中,我使用"complete.obs"矢量化而不是运行某种循环。 df == 0返回(尝试)与df == 0大小相同的矩阵,条目为dfTRUE。此外,我们还允许将此矩阵传递给子集FALSE(请参阅[...])。最后,虽然?'['的结果非常直观,但df[df == 0]给出了期望的效果似乎很奇怪。赋值运算符df[df == 0] <- NA实际上并不总是如此智能,并且不能以这种方式与其他一些对象一起工作,但它使用数据框来实现;见<-


1 集合论中的空集感觉有些相关。
2 与集合理论的另一个相似之处:空集是每个集合的子集,但我们不为它保留任何空间。

答案 1 :(得分:27)

我假设您的data.frame是不同数据类型的混合,并非所有列都需要修改。

仅修改第12至18列(总共21个),只需执行此操作

df[, 12:18][df[, 12:18] == 0] <- NA

答案 2 :(得分:22)

没有[<-函数的替代方法:

示例数据框dat(从@ Chase的回答中无耻地复制):

dat

  x y
1 0 2
2 1 2
3 1 1
4 2 1
5 0 0

NA函数可以用is.na<-替换零:

is.na(dat) <- !dat


dat

   x  y
1 NA  2
2  1  2
3  1  1
4  2  1
5 NA NA

答案 3 :(得分:14)

#Sample data
set.seed(1)
dat <- data.frame(x = sample(0:2, 5, TRUE), y = sample(0:2, 5, TRUE))
#-----
  x y
1 0 2
2 1 2
3 1 1
4 2 1
5 0 0

#replace zeros with NA
dat[dat==0] <- NA
#-----
   x  y
1 NA  2
2  1  2
3  1  1
4  2  1
5 NA NA

答案 4 :(得分:14)

dplyr::na_if()是一个选项:

library(dplyr)  

df <- data_frame(col1 = c(1, 2, 3, 0),
                 col2 = c(0, 2, 3, 4),
                 col3 = c(1, 0, 3, 0),
                 col4 = c('a', 'b', 'c', 'd'))

na_if(df, 0)
# A tibble: 4 x 4
   col1  col2  col3 col4 
  <dbl> <dbl> <dbl> <chr>
1     1    NA     1 a    
2     2     2    NA b    
3     3     3     3 c    
4    NA     4    NA d

答案 5 :(得分:12)

因为有人要求提供Data.Table版本,并且因为给定的data.frame解决方案不能与data.table一起使用,所以我提供了以下解决方案。

基本上,使用:=运算符 - &gt; 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

答案 6 :(得分:4)

您只能在数字字段中将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)

答案 7 :(得分:1)

如果有人通过Google到达这里寻找相反的(即如何将data.frame中的所有NA替换为0),答案是

df[is.na(df)] <- 0

OR

使用dplyr / tidyverse

library(dplyr)
mtcars %>% replace(is.na(.), 0)

答案 8 :(得分:0)

如果您和我一样,在想知道如何用 NA 替换数据框中的所有值时来到这里,那就是:

df[,] <- NA