在 R 中,有条件地添加其中一个变量必须为正的值(使用 rowsums)

In R. conditionally adding values where one of the variables has to be positive (using rowsums)

我之前使用以下代码添加一行的值:

subset$EBIT <- rowSums(subset[c("rorresul", "resand", "rteinknc", 
                                            "rteinext", "rteinov")], na.rm = TRUE)

但是,我实际上需要包括“resand”只有在它是肯定的情况下才应该包括在内的条件。其他值可以是正数也可以是负数,无关紧要。我使用了 rowSums,否则如果其中一个变量中有缺失值,我的总和就会变成缺失值。

如果您需要数据样本,这里有一些:

rorresul  resand  rteinknc  rteinext  rteinov
  40        30       2         2         2
  50        -40      5         5         5
  30         0       1         1         1

非常感谢任何帮助!谢谢!

我只是对所有内容求和,然后在之后减去重沙:

library(dplyr)

df %>% 
  mutate(
    EBIT = rowSums(across(everything())),
    EBIT = ifelse(resand < 0, EBIT - resand, EBIT)
  )

#   rorresul resand rteinknc rteinext rteinov EBIT
# 1       40     30        2        2       2   76
# 2       50    -40        5        5       5   65
# 3       30      0        1        1       1   33

这是数据:

df <- data.frame(
  rorresul = c(40, 50, 30),
  resand = c(30, -40, 0),
  rteinknc = c(2, 5, 1),
  rteinext = c(2, 5, 1),
  rteinov = c(2, 5, 1),
  stringsAsFactors = FALSE
)

编辑 如果您有不应包含在 rowSums 中的变量,那么您可以预先指定这些:

sumVars <- c("rorresul", "resand", "rteinknc", "rteinext", "rteinov")

df %>% 
  mutate(
    EBIT = rowSums(across(all_of(sumVars))),
    EBIT = ifelse(resand < 0, EBIT - resand, EBIT)
  )

您可以使用pmaxresand的负值变为0并计算rowSums

cols <- c("rorresul", "resand", "rteinknc", "rteinext", "rteinov")
df$EBIT <- rowSums(transform(df, resand = pmax(resand, 0))[cols])
df
#  rorresul resand rteinknc rteinext rteinov EBIT
#1       40     30        2        2       2   76
#2       50    -40        5        5       5   65
#3       30      0        1        1       1   33