用不同类型的缺失替换一系列变量中的 NA
Replace NA in a series of variables with different types of missing
这是我的数据。
# A tibble: 10 x 6
id main s_0 s_1 s_2 s_3
<dbl> <fct> <fct> <fct> <fct> <fct>
1 1 5 75 A 4 110
2 2 NA NA NA NA NA
3 3 11 13 NA 7 769
4 4 NA NA NA NA NA
5 5 11 NA NA NA 835
6 6 13 39 NA 4 NA
7 7 NA NA NA NA NA
8 8 19 42 D 6 654
9 9 20 4 NA 7 577
10 10 NA NA NA NA NA
如您所见,主要列表示其他列 (s_0: s_4) 中的行是否回答了问题。 ID 2、4、7 和 10 没有资格参加其余的比赛,但是,其他参与者可以回答或错过 (s_0:s_4)。所以我有一个混合的NA,我想使用一个可以识别丢失来源的代码。
我正在使用的代码混合了所有类型的缺失:
library(dplyr)
library(forcats)
# Make sample data vars factors
dat <- dat %>%
mutate(across(starts_with("s_"), as.factor))
# Add 'No' as factor level
dat %>%
mutate(across(starts_with("s_"), fct_explicit_na, "No"))
虽然我想要这样的东西:
# A tibble: 10 x 6
id main s_0 s_1 s_2 s_3
<dbl> <fct> <fct> <fct> <fct> <fct>
1 1 5 75 A 4 110
2 2 NO1 NO1 NO1 NO1 NO1
3 3 11 13 NO 7 769
4 4 NO1 NO1 NO1 NO1 NO1
5 5 11 NO NO NO 835
6 6 13 39 NO 4 NA
7 7 NO1 NO1 NO1 NO1 NO1
8 8 19 42 D 6 654
9 9 20 4 NO 7 577
10 10 NO1 NO1 NO1 NO1 NO1
尝试:
#Convert columns to characters
df[-1] <- lapply(df[-1], as.character)
#Find index of `NA` value in `main` column
inds <- is.na(df$main)
#Change all the columns to "NO1" in row inds
df[inds, -1] <- 'NO1'
#Change remaining NA values to "NO"
df[is.na(df)] <- 'NO'
df
# id main s_0 s_1 s_2 s_3
#1 1 5 75 A 4 110
#2 2 NO1 NO1 NO1 NO1 NO1
#3 3 11 13 NO 7 769
#4 4 NO1 NO1 NO1 NO1 NO1
#5 5 11 NO NO NO 835
#6 6 13 39 NO 4 NO
#7 7 NO1 NO1 NO1 NO1 NO1
#8 8 19 42 D 6 654
#9 9 20 4 NO 7 577
#10 10 NO1 NO1 NO1 NO1 NO1
这是我的数据。
# A tibble: 10 x 6
id main s_0 s_1 s_2 s_3
<dbl> <fct> <fct> <fct> <fct> <fct>
1 1 5 75 A 4 110
2 2 NA NA NA NA NA
3 3 11 13 NA 7 769
4 4 NA NA NA NA NA
5 5 11 NA NA NA 835
6 6 13 39 NA 4 NA
7 7 NA NA NA NA NA
8 8 19 42 D 6 654
9 9 20 4 NA 7 577
10 10 NA NA NA NA NA
如您所见,主要列表示其他列 (s_0: s_4) 中的行是否回答了问题。 ID 2、4、7 和 10 没有资格参加其余的比赛,但是,其他参与者可以回答或错过 (s_0:s_4)。所以我有一个混合的NA,我想使用一个可以识别丢失来源的代码。 我正在使用的代码混合了所有类型的缺失:
library(dplyr)
library(forcats)
# Make sample data vars factors
dat <- dat %>%
mutate(across(starts_with("s_"), as.factor))
# Add 'No' as factor level
dat %>%
mutate(across(starts_with("s_"), fct_explicit_na, "No"))
虽然我想要这样的东西:
# A tibble: 10 x 6
id main s_0 s_1 s_2 s_3
<dbl> <fct> <fct> <fct> <fct> <fct>
1 1 5 75 A 4 110
2 2 NO1 NO1 NO1 NO1 NO1
3 3 11 13 NO 7 769
4 4 NO1 NO1 NO1 NO1 NO1
5 5 11 NO NO NO 835
6 6 13 39 NO 4 NA
7 7 NO1 NO1 NO1 NO1 NO1
8 8 19 42 D 6 654
9 9 20 4 NO 7 577
10 10 NO1 NO1 NO1 NO1 NO1
尝试:
#Convert columns to characters
df[-1] <- lapply(df[-1], as.character)
#Find index of `NA` value in `main` column
inds <- is.na(df$main)
#Change all the columns to "NO1" in row inds
df[inds, -1] <- 'NO1'
#Change remaining NA values to "NO"
df[is.na(df)] <- 'NO'
df
# id main s_0 s_1 s_2 s_3
#1 1 5 75 A 4 110
#2 2 NO1 NO1 NO1 NO1 NO1
#3 3 11 13 NO 7 769
#4 4 NO1 NO1 NO1 NO1 NO1
#5 5 11 NO NO NO 835
#6 6 13 39 NO 4 NO
#7 7 NO1 NO1 NO1 NO1 NO1
#8 8 19 42 D 6 654
#9 9 20 4 NO 7 577
#10 10 NO1 NO1 NO1 NO1 NO1