如何应用多个条件从 R 中的当前变量创建新变量?

How do I apply multiple conditions to create new variable from current variables in R?

我正在尝试对当前变量应用多个条件来创建新变量。我正在查看 5 variables/columns 并希望应用以下条件。如果 5 个变量中有 3 个大于 0,则仅取大于 0 的变量的平均值。如果 <3 个变量 >0 则 NA

例如,

ID Work School School 2 Work 1 Work 2 New Variable
1 5 -2 -1 -7 2 NA
2 3 5 -1 2 3 3.25
3 4 5 1 3 3 3.2
4 -1 2 -7 2 4 2.67
df[["New Variable"]] <- apply(df[, -1], 1, function(row) {
  if (sum(row > 0) >= 3) mean(row[row > 0]) else NA
})

df[, -1] 是忽略第一列 (ID)


其中 df 是:

df <- read.table(text = 
'ID Work    School  "School 2"  "Work 1"    "Work 2"
1   5   -2  -1  -7  2
2   3   5   -1  2   3
3   4   5   1   3   3
4   -1  2   -7  2   4
', header = TRUE, check.names = FALSE)

使用我们创建逻辑矩阵 (i1) 的向量化解决方案,然后使用 rowSums 创建逻辑向量并使用 ifelse 到 return [=通过将其他元素更改为 NA 并使用 na.rm 参数

,只有那些具有大于或等于 3 个正值的元素中的 15=]
i1 <- df[-1] > 0
df$New <- ifelse(rowSums(i1) >= 3, rowMeans(replace(df[-1],
       !i1, NA), na.rm = TRUE), NA)

数据

df <- structure(list(ID = 1:4, Work = c(5L, 3L, 4L, -1L), School = c(-2L, 
5L, 5L, 2L), `School 2` = c(-1L, -1L, 1L, -7L), `Work 1` = c(-7L, 
2L, 3L, 2L), `Work 2` = c(2L, 3L, 3L, 4L)), class = "data.frame",
row.names = c(NA, 
-4L))