将所有0值替换为NA

See*_*een 124 r

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

Jul*_*ora 215

将所有零替换为NA:

df[df == 0] <- NA
Run Code Online (Sandbox Code Playgroud)



说明

1.这不是NULL你应该用零替换零的东西.正如它所说?'NULL',

NULL表示R中的空对象

这是独特的,我想,可以看作是最无信息和空洞的对象.1那就不那么令人惊讶了

data.frame(x = c(1, NULL, 2))
#   x
# 1 1
# 2 2
Run Code Online (Sandbox Code Playgroud)

也就是说,R不为此null对象保留任何空间.2同时,看着?'NA'我们看到了

NA是长度为1的逻辑常量,其包含缺失值指示符.除了原始NA之外,NA可以被强制转换为任何其他矢量类型.

重要的NA是,长度为1,以便R为其保留一些空间.例如,

data.frame(x = c(1, NA, 2))
#    x
# 1  1
# 2 NA
# 3  2
Run Code Online (Sandbox Code Playgroud)

此外,数据帧结构要求所有列具有相同数量的元素,以便不存在"空洞"(即NULL值).

现在,您可以NULL在数据框中替换零,从而完全删除包含至少一个零的所有行.当使用,例如,var,cov,或cor,实际上等同于第一与替换零NA和设置的值use作为"complete.obs".然而,通常情况下,这是不能令人满意的,因为它会导致额外的信息丢失.

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


1集理论中的空集感觉某种程度上相关.
2与集合论的另一个相似之处:空集是每个集的子集,但我们不为它预留任何空间.

  • 我看到你已经获得了很多选票,但不认为这适当地涵盖了值为"0"的非数字列的边缘情况,这些情况并未要求设置为<NA>. (6认同)
  • data.table对象的等效语法是什么? (3认同)

use*_*rJT 29

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

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

df[, 12:18][df[, 12:18] == 0] <- NA
Run Code Online (Sandbox Code Playgroud)

  • 这是可行的,并且比公认的答案更灵活。 (2认同)

Sve*_*ein 22

没有这个[<-功能的替代方法:

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

dat

  x y
1 0 2
2 1 2
3 1 1
4 2 1
5 0 0
Run Code Online (Sandbox Code Playgroud)

可以使用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
Run Code Online (Sandbox Code Playgroud)


sbh*_*bha 19

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
Run Code Online (Sandbox Code Playgroud)


Cha*_*ase 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
Run Code Online (Sandbox Code Playgroud)


Rei*_*ein 12

因为有人要求提供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
Run Code Online (Sandbox Code Playgroud)

  • 或者`for(j in names(DT)); set(DT,(DT [[j]] == 0),j,NA)`.有关使用data.table查找和替换值的更详细讨论,请参见[此处](http://stackoverflow.com/a/7249454/4241780). (2认同)

use*_*745 9

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

df[is.na(df)] <- 0
Run Code Online (Sandbox Code Playgroud)

或者

使用 dplyr / tidyverse

library(dplyr)
mtcars %>% replace(is.na(.), 0)
Run Code Online (Sandbox Code Playgroud)


小智 7

这是我为那些正在努力处理具有不同类型列的数据集的人的贡献,其中多个值代表缺失数据。

dat <- data_frame(numA = c(1, 0, 3, 4),
             numB = c(NA, 2, 3, 4),
             strC = c("0", "1.2", "NA", "2.4"),
             strD = c("Yes", "Yes", "missing", "No"))
Run Code Online (Sandbox Code Playgroud)

假设在此数据中,我们希望将数字列中的 0 替换为 ,NA并将字符/字符串值中的“NA”和“缺失”值替换为NA。请注意,列中的“NA”strC是字符类型值,而不是所需的NA

dat
# A tibble: 4 x 4
  numA   numB  strC  strD   
  <dbl>  <dbl> <chr> <chr>  
1     1     NA 0     Yes    
2     0      2 1.2   Yes    
3     3      3 'NA'  missing
4     4      4 2.4   No 
Run Code Online (Sandbox Code Playgroud)

首先,一个明显的情况是,请注意,将字符列转换为数值时,任何非数字字符串值都会被强制转换为NA.

as.numeric(dat$strC)
[1] 0.0 1.2  NA 2.4 
Run Code Online (Sandbox Code Playgroud)

用索引回答:

dat[dat == "NA" | dat =="missing"] <- NA
Run Code Online (Sandbox Code Playgroud)

但是,请勿将其用于 0,因为它将数字和字符 0 更改为NA。这是因为R 中的"0" == 0回报。TRUE

dplyr::na_if 方法:

library(dplyr)

dat %>%
  lapply(na_if, y = "missing") %>%
  lapply(na_if, y = "NA") %>%
  lapply(na_if, y = 0) %>%  # DONT DO THIS! It converts string 0s to NA as well!
  data.frame()
Run Code Online (Sandbox Code Playgroud)

在这里,我们将na_if函数应用于数据的每一列。由于na_if不接受要转换为的多个值,NA我们需要为每个要转换为的值编写多行代码NA。然而,简单地使用此函数 with0即可将数字和字符0s 转换为NA. 我们需要做点别的事情!

将 mutate across 方法与 na_if 函数一起使用:

这是我最喜欢的解决方案。在这里,我们检查列类型并na_if根据需要应用函数。该字符0保持不变,而所有所需的值都转换为NA.

dat %>%
  mutate(across(where(is.numeric), ~na_if(., 0))) %>%
  mutate(across(where(is.character), ~na_if(., "NA"))) %>%
  mutate(across(where(is.character), ~na_if(., "missing")))

# A tibble: 4 x 4
   numA  numB strC  strD 
  <dbl> <dbl> <chr> <chr>
1     1    NA 0     Yes  
2    NA     2 1.2   Yes  
3     3     3 NA    NA   
4     4     4 2.4   No 
Run Code Online (Sandbox Code Playgroud)

最后nariar打包就可以使用了

nariar是一个最近推出的软件包,引入了多种replace_with_功能。

library(naniar)
Run Code Online (Sandbox Code Playgroud)

将所有“NA”和“缺失”值替换为NA

dat %>%
  replace_with_na_all(~.x %in% c("NA", "missing"))
Run Code Online (Sandbox Code Playgroud)

但如果将其与0s 一起使用,它仍然会错误地将字符 0 转换为NA

dat %>%
  replace_with_na_all(~.x %in% c(0, "NA", "missing"))

# A tibble: 4 x 4
   numA  numB strC  strD 
  <dbl> <dbl> <chr> <chr>
1     1    NA NA    Yes  
2    NA     2 1.2   Yes  
3     3     3 NA    NA   
4     4     4 2.4   No
#strC's first element should not be NA here!
Run Code Online (Sandbox Code Playgroud)

因此,我们必须使用replace_with_na_if指定列类型:

dat %>%
  replace_with_na_if(is.character, ~.x %in% c("NA", "missing")) %>%
  replace_with_na_if(is.numeric, ~.x %in% c(0))

# A tibble: 4 x 4
   numA  numB strC  strD 
  <dbl> <dbl> <chr> <chr>
1     1    NA 0     Yes  
2    NA     2 1.2   Yes  
3     3     3 NA    NA   
4     4     4 2.4   No
Run Code Online (Sandbox Code Playgroud)

我们达到了预期的结果。我希望这一切对您有所帮助:)