簡體   English   中英

如何在 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 . . 使用==創建一個邏輯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)

通常,這可以一起避免,同時讀取數據本身,即指定na.strings = "." read.csv/read.table

您可以使用na_if中的 na_if dplyr 請注意,點會將列的類型更改為char ,這可能不是您以后想要的! 以下代碼查找所有char列,替換. 使用NA並將列轉換為數字:

df <- df %>%
    mutate(across(where(is.character), ~as.numeric(na_if(., "."))))

這是來自sjlabelled package 的set_na的替代方案。 請注意,這些列將保留為字符類型。

library(sjlabelled)
set_na(df, na = ".", as.tag = FALSE)

Output:

ITEM1 ITEM2 ITEM3 ITEM4 ITEM5
1     6     1     4  <NA>     1
2     8     6     2     3     6
3  <NA>     9     5     2     9

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM