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,与所述条目TRUE和FALSE.此外,我们还允许将此矩阵传递给子集[...](请参阅参考资料?'[').最后,虽然结果df[df == 0]非常直观,但是df[df == 0] <- NA给出期望的效果似乎很奇怪.赋值运算符<-实际上并不总是如此智能,并且不能以这种方式与其他一些对象一起工作,但是它使用数据帧; 看?'<-'.
1集理论中的空集感觉某种程度上相关.
2与集合论的另一个相似之处:空集是每个集的子集,但我们不为它预留任何空间.
use*_*rJT 29
我假设您的data.frame是不同数据类型的混合,并不是所有列都需要修改.
要仅修改第12列到第18列(总共21个),只需执行此操作即可
df[, 12:18][df[, 12:18] == 0] <- NA
Run Code Online (Sandbox Code Playgroud)
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)
如果有人通过谷歌到达这里寻找相反的东西(即如何用 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
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. 我们需要做点别的事情!
这是我最喜欢的解决方案。在这里,我们检查列类型并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)
我们达到了预期的结果。我希望这一切对您有所帮助:)