如何将所有 NA 的行求和为 0/NA

How to sum across rows with all NAs to be 0/NA

我有一个数据框:

dat <- data.frame(X1 = c(0, NA, NA),
                  X2 = c(1, NA, NA),
                  X3 = c(1, NA, NA),
                  Y1 = c(1, NA, NA),
                  Y2 = c(NA, NA, NA),
                  Y3 = c(0, NA, NA))

我想为 X 和 Y 变量创建综合分数。这是我目前所拥有的:

clean_dat <- dat %>% rowwise() %>% mutate(X = sum(c(X1, X2, X3), na.rm = T),
                                          Y = sum(c(Y1, Y2, Y3), na.rm = T))

但是,我希望所有 NA 行(即第 2 行和第 3 行)在 XY 列中的综合得分为 0。有人知道怎么做吗?

编辑:我想知道如何在第 2 行和第 3 行中制作 XY NA

非常感谢!

默认情况下,sumrowSums return当我们使用na.rm = TRUE且所有元素都是NA时为0。为防止这种情况,请使用 if/elsecase_when 方法,即确定是否有任何 non-NA 元素带有 if_any,然后在其中获取相关列的 rowSums case_when(默认情况下 TRUE 将 return NA

library(dplyr)
dat %>% 
  mutate(X = case_when(if_any(starts_with('X'), complete.cases) 
    ~ rowSums(across(starts_with('X')), na.rm = TRUE)),
   Y = case_when(if_any(starts_with('Y'), complete.cases) ~ 
    rowSums(across(starts_with('Y')), na.rm = TRUE)) )

-输出

  X1 X2 X3 Y1 Y2 Y3  X  Y
1  0  1  1  1 NA  0  2  1
2 NA NA NA NA NA NA NA NA
3 NA NA NA NA NA NA NA NA