0

我正在尝试改变 5 列数据的新变量(总和),但前提是受影响列(v2 到 v6)的 NA 计数为 2 或更少,否则返回 NA。下面的代码仅在没有 NA 的情况下求和。帮助表示赞赏。

df <- data.frame(v1=c("A","B","C","D","E","F"), v2=c(4,NA,5,6,NA,NA), v3=c(7,8,9,NA,NA,NA),
                 v4=c(NA,3,5,NA,1,4), v5=c(NA,3,5,NA,1,NA), v6=c(NA,3,5,NA,1,4))
df
library(dplyr)
df = df %>% 
  rowwise() %>% 
  mutate(sum(v2, v3, v4, v5, v6))
df
4

1 回答 1

1

在基数 R 中,我们可以使用rowSums两次,第一次计算每行中值的总和,第二次计算NAR 中的 's数。

ifelse(rowSums(is.na(df[-1])) <= 2, rowSums(df[-1], na.rm = TRUE), NA)
#[1] NA 17 29 NA  3 NA

使用dplyrrow-wise 你可以这样做:

library(dplyr)
df %>%
  rowwise() %>%
  mutate(col = ifelse(sum(is.na(c_across(v2:v6))) <= 2, 
                      sum(c_across(v2:v6), na.rm = TRUE), NA))

# A tibble: 6 x 7
#  v1       v2    v3    v4    v5    v6   col
#  <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 A         4     7    NA    NA    NA    NA
#2 B        NA     8     3     3     3    17
#3 C         5     9     5     5     5    29
#4 D         6    NA    NA    NA    NA    NA
#5 E        NA    NA     1     1     1     3
#6 F        NA    NA     4    NA     4    NA

ifelse使用来自@rpolicastro 的建议缩短了代码。

于 2020-09-21T01:31:01.460 回答