我有一個資料框,其中一些列應將 99 視為缺失值 (NA),而其他列中 999 是為此目的給出的值。
dat$variable1 <- ifelse(dat$variable1 == 99, NA, dat$variable1)
dat$variable2 <- ifelse(dat$variable2 == 99, NA, dat$variable2)
dat$variable3 <- ifelse(dat$variable3 == 99, NA, dat$variable3)
dat$variable4 <- ifelse(dat$variable4 == 99, NA, dat$variable4)
dat$variable5 <- ifelse(dat$variable5 == 999, NA, dat$variable5)
dat$variable6 <- ifelse(dat$variable6 == 999, NA, dat$variable6)
dat$variable7 <- ifelse(dat$variable7 == 999, NA, dat$variable7)
我想找到一種更好的方法來做到這一點,因為有時我們可以處理許多列。我不知道如何回圈我應該替換 NA 的這些值的特定變數,而且我不知道可以幫助我解決這個問題的包(我是 R 的初學者)。
編輯:我必須為我在問題中犯的錯誤道歉。我首先發布dat$variable1 <- ifelse(dat$variable1 == 99, NA, dat$EC),在所有代碼行中保留“dat$EC”。謝謝大家的回答。
uj5u.com熱心網友回復:
如果 99 和 999 是資料框中缺失的唯一值dat,您可以:
dat[dat == 999] <- NA
dat[dat == 99] <- NA
如果沒有,您可以使用na_iffromdplyr
library(dplyr)
dat_1 <- dat %>%
mutate(across(c(variable1, variable2, variable3, variable4), na_if, 99),
across(c(variable5, variable6, variable7), na_if, 999))
dat_1
uj5u.com熱心網友回復:
考慮ifelse在列塊上運行,因為它適用于向量和矩陣:
var_99 <- c("variable1", "variable2", "variable3", "variable4")
var_999 <- c("variable5", "variable6", "variable7")
dat[var_99] <- ifelse(dat[var_99] == 99, NA, dat$EC)
dat[var_999] <- ifelse(dat[var_999] == 999, NA, dat$EC)
對于多個變數替換,將no引數強制轉換為矩陣:
dat[var_99] <- ifelse(dat[var_99] == 99, NA, as.matrix(dat[var_99]))
dat[var_999] <- ifelse(dat[var_999] == 999, NA, as.matrix(dat[var_99]))
uj5u.com熱心網友回復:
您可以嘗試使用dplyr::across.
對于dat像這樣定義的虛擬資料
dat <- data.frame(
variable1 = c(1,2,3,4,5,6,99),
variable2 = c(1,2,99,4,5,6,7),
variable3 = c(1:7),
variable4 = c(5:11),
variable5 = c(1,2,3,4,5,6,999),
variable6 = c(1,2,3,4,999,6,7),
variable7 = c(1:7),
EC = c(-1,-2,-3,-4,-5,-6,-7)
)
variable1 variable2 variable3 variable4 variable5 variable6 variable7 EC
1 1 1 1 5 1 1 1 -1
2 2 2 2 6 2 2 2 -2
3 3 99 3 7 3 3 3 -3
4 4 4 4 8 4 4 4 -4
5 5 5 5 9 5 999 5 -5
6 6 6 6 10 6 6 6 -6
7 99 7 7 11 999 7 7 -7
你可以試試這個方法。
library(dplyr)
dat %>%
rowwise %>%
mutate(across(variable1:variable4, ~ifelse(.x == 99, NA, EC)),
across(variable5:variable7, ~ifelse(.x == 999, NA, EC)))
variable1 variable2 variable3 variable4 variable5 variable6 variable7 EC
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 -1 -1 -1 -1 -1 -1 -1 -1
2 -2 -2 -2 -2 -2 -2 -2 -2
3 -3 NA -3 -3 -3 -3 -3 -3
4 -4 -4 -4 -4 -4 -4 -4 -4
5 -5 -5 -5 -5 -5 NA -5 -5
6 -6 -6 -6 -6 -6 -6 -6 -6
7 NA -7 -7 -7 NA -7 -7 -7
如果您知道列索引,例如在 my 中dat, from variable1to variable4is1:4和variable5to variable7is 5:7,僅使用列索引會給您相同的結果。
dat %>%
rowwise %>%
mutate(across(1:4, ~ifelse(.x == 99, NA, EC)),
across(5:7, ~ifelse(.x == 999, NA, EC)))
variable1 variable2 variable3 variable4 variable5 variable6 variable7 EC
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 -1 -1 -1 -1 -1 -1 -1 -1
2 -2 -2 -2 -2 -2 -2 -2 -2
3 -3 NA -3 -3 -3 -3 -3 -3
4 -4 -4 -4 -4 -4 -4 -4 -4
5 -5 -5 -5 -5 -5 NA -5 -5
6 -6 -6 -6 -6 -6 -6 -6 -6
7 NA -7 -7 -7 NA -7 -7 -7
添加
dat <- data.frame(
variable1 = c(1,2,3,4,5,6,99),
variable2 = c(1,2,99,4,5,6,7),
variable3 = c(1:7),
variable4 = c(5:10,999),
variable5 = c(1,2,3,4,5,6,99),
variable6 = c(1,2,3,4,999,6,7),
variable7 = c(1:7),
EC = c(-1,-2,-3,-4,-5,-6,-7)
)
dat %>%
rowwise %>%
mutate(across(c(variable1, variable2, variable3, variable5), ~ifelse(.x == 99, NA, EC)),
across(c(variable4, variable6, variable7), ~ifelse(.x == 999, NA, EC)))
variable1 variable2 variable3 variable4 variable5 variable6 variable7 EC
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 -1 -1 -1 -1 -1 -1 -1 -1
2 -2 -2 -2 -2 -2 -2 -2 -2
3 -3 NA -3 -3 -3 -3 -3 -3
4 -4 -4 -4 -4 -4 -4 -4 -4
5 -5 -5 -5 -5 -5 NA -5 -5
6 -6 -6 -6 -6 -6 -6 -6 -6
7 NA -7 -7 NA NA -7 -7 -7
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/364848.html
