R语言 如果缺少的列少于x列,则替换缺少的值

epggiuax  于 2023-05-20  发布在  其他
关注(0)|答案(3)|浏览(124)

我希望仅对var1:var6列中缺失值少于2个的行,将var1:var6列中的缺失值替换为零。然后我想重新计算sum列(我可以很高兴地使用rowwise()作为我的reprex)。
我已经尝试了一些事情使用across(),或rowwise()c_across(),但我努力找到一个解决方案。

library(tidyverse)

# Generate data
set.seed(40)
dat <- tibble(
  id = 1:6,
  var1 = sample(c(0:4, NA), 6, replace = TRUE),
  var2 = sample(c(0:4, NA), 6, replace = TRUE),
  var3 = sample(c(0:4, NA), 6, replace = TRUE),
  var4 = sample(c(0:4, NA), 6, replace = TRUE),
  var5 = sample(c(0:4, NA), 6, replace = TRUE),
  var6 = sample(c(0:4, NA), 6, replace = TRUE),
) %>%
  mutate(sum = rowSums(across(var1:var6)))

这是当前的tibble:

> dat
# A tibble: 6 × 8
     id  var1  var2  var3  var4  var5  var6   sum
  <int> <int> <int> <int> <int> <int> <int> <int>
1     1     3     4     4    NA    NA     2    NA
2     2    NA    NA     4     3     4     2    NA
3     3     4     4     1     1     4     1    15
4     4     1     2     4     4     4    NA    NA
5     5     2     1     4     4    NA     2    NA
6     6     1     3     1     0     0     4     9

我希望输出看起来像这样:

> new_dat
# A tibble: 6 × 8
     id  var1  var2  var3  var4  var5  var6   sum
  <int> <int> <int> <int> <int> <int> <int> <int>
1     1     3     4     4    NA    NA     2    NA
2     2    NA    NA     4     3     4     2    NA
3     3     4     4     1     1     4     1    15
4     4     1     2     4     4     4     0    15
5     5     2     1     4     4     0     2    13
6     6     1     3     1     0     0     4     9
bhmjp9jg

bhmjp9jg1#

你可以像这样使用across

dat %>% 
  mutate(across(var1:var6, ~ replace(.x, is.na(.x) & rowSums(is.na(across(var1:var6))) < 2, 0)),
         sum = rowSums(across(var1:var6)))

# # A tibble: 6 × 8
#      id  var1  var2  var3  var4  var5  var6   sum
#   <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1     1     3     4     4    NA    NA     2    NA
# 2     2    NA    NA     4     3     4     2    NA
# 3     3     4     4     1     1     4     1    15
# 4     4     1     2     4     4     4     0    15
# 5     5     2     1     4     4     0     2    13
# 6     6     1     3     1     0     0     4     9
vbkedwbf

vbkedwbf2#

要使用rowwise()最小限度地调整代码,可以将sum()中的参数na.rm设置为灵活的逻辑值,以指示该行的缺失值是否少于2个。

dat %>%
  rowwise() %>%
  mutate(sum = c_across(var1:var6) %>% sum(na.rm = sum(is.na(.)) < 2)) %>%
  ungroup()

# # A tibble: 6 × 8
#      id  var1  var2  var3  var4  var5  var6   sum
#   <int> <int> <int> <int> <int> <int> <int> <int>
# 1     1     3     4     4    NA    NA     2    NA
# 2     2    NA    NA     4     3     4     2    NA
# 3     3     4     4     1     1     4     1    15
# 4     4     1     2     4     4     4    NA    15
# 5     5     2     1     4     4    NA     2    13
# 6     6     1     3     1     0     0     4     9
6jjcrrmo

6jjcrrmo3#

如果NA最多出现一次,则将其转换为0。然后像往常一样获取rowSums:

cc <- grep("^var", colnames(dat), value = TRUE)
rr <- which(rowSums(is.na(dat[ cc ])) < 2)
dat[ rr, cc ][ is.na(dat[ rr, cc ]) ] <- 0

dat$sum <- rowSums(dat[ cc ])
#   id var1 var2 var3 var4 var5 var6 sum
# 1  1    3    4    4   NA   NA    2  NA
# 2  2   NA   NA    4    3    4    2  NA
# 3  3    4    4    1    1    4    1  15
# 4  4    1    2    4    4    4    0  15
# 5  5    2    1    4    4    0    2  13
# 6  6    1    3    1    0    0    4   9

相关问题