如何应用多个条件从 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))
我正在尝试对当前变量应用多个条件来创建新变量。我正在查看 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
参数
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))