如何在 R 中将点重新编码为 NA?
How to recode dot to NA in R?
我有一个数据集,其中缺失值用点编码。我想将缺失值留空 (NA)。
这是数据框:
df <- data.frame(ITEM1 = c(6, 8, '.'),
ITEM2 = c(1, 6, 9),
ITEM3 = c(4, 2, 5),
ITEM4 = c('.', 3, 2),
ITEM5 = c(1, 6, 9)
)
df
ITEM1 ITEM2 ITEM3 ITEM4 ITEM5
1 6 1 4 . 1
2 8 6 2 3 6
3 . 9 5 2 9
>
列将是 character
class 因为存在 .
。使用 ==
创建逻辑 matrix
并将这些元素分配给 NA
,然后使用 type.convert
将 data.frame 列转换为其适当的类型
df[df == "." & !is.na(df)] <- NA
df <- type.convert(df, as.is = TRUE)
或使用 replace
一步(在内部进行分配)
df <- type.convert(replace(df, df == "." & !is.na(df), NA), as.is = TRUE)
或者另一种方法是
df[] <- lapply(df, function(x) replace(x x %in% '.', NA))
df <- type.convert(df, as.is = TRUE)
通常,这可以一起避免,同时读取数据本身,即在 read.csv/read.table
中指定 na.strings = "."
等
您可以使用 dplyr
中的 na_if
函数。请注意,点将列的类型更改为 char
,这可能不是您之后想要的!以下代码查找所有 char
列,将 .
替换为 NA
并将该列转换为数字:
df <- df %>%
mutate(across(where(is.character), ~as.numeric(na_if(., "."))))
这是 sjlabelled
包中 set_na
的替代方案。请注意,列将保留为字符类型。
library(sjlabelled)
set_na(df, na = ".", as.tag = FALSE)
输出:
ITEM1 ITEM2 ITEM3 ITEM4 ITEM5
1 6 1 4 <NA> 1
2 8 6 2 3 6
3 <NA> 9 5 2 9
我有一个数据集,其中缺失值用点编码。我想将缺失值留空 (NA)。
这是数据框:
df <- data.frame(ITEM1 = c(6, 8, '.'),
ITEM2 = c(1, 6, 9),
ITEM3 = c(4, 2, 5),
ITEM4 = c('.', 3, 2),
ITEM5 = c(1, 6, 9)
)
df
ITEM1 ITEM2 ITEM3 ITEM4 ITEM5
1 6 1 4 . 1
2 8 6 2 3 6
3 . 9 5 2 9
>
列将是 character
class 因为存在 .
。使用 ==
创建逻辑 matrix
并将这些元素分配给 NA
,然后使用 type.convert
df[df == "." & !is.na(df)] <- NA
df <- type.convert(df, as.is = TRUE)
或使用 replace
一步(在内部进行分配)
df <- type.convert(replace(df, df == "." & !is.na(df), NA), as.is = TRUE)
或者另一种方法是
df[] <- lapply(df, function(x) replace(x x %in% '.', NA))
df <- type.convert(df, as.is = TRUE)
通常,这可以一起避免,同时读取数据本身,即在 read.csv/read.table
中指定 na.strings = "."
等
您可以使用 dplyr
中的 na_if
函数。请注意,点将列的类型更改为 char
,这可能不是您之后想要的!以下代码查找所有 char
列,将 .
替换为 NA
并将该列转换为数字:
df <- df %>%
mutate(across(where(is.character), ~as.numeric(na_if(., "."))))
这是 sjlabelled
包中 set_na
的替代方案。请注意,列将保留为字符类型。
library(sjlabelled)
set_na(df, na = ".", as.tag = FALSE)
输出:
ITEM1 ITEM2 ITEM3 ITEM4 ITEM5
1 6 1 4 <NA> 1
2 8 6 2 3 6
3 <NA> 9 5 2 9