r - 在其他多个变量上创建具有条件的变量
问题描述
我正在尝试创建具有其他多个变量条件的变量。
例如,我有 5 个变量,A
, B
, C
, D
, E
。它们的范围从 1 到 8。
我想grade
使用以下条件创建新变量 。
1) 如果任何变量 ( A
to E
) 小于 2,则等级为 1
2) 如果所有变量都大于 3,并且任何变量在 3、4 之间,则评分为 2。
3) 如果所有变量都大于 5,则等级为 3。
test
我任意创建数据集。
test<-data.frame(A=c(4,7,4,1,4),
B=c(8,8,6,5,8),
C=c(6,5,6,7,5),
D=c(7,8,7,5,8),
E=c(5,7,8,5,5))
test
在这种情况下,grade
将是 2,3,2,1,2。
我尝试mutate_at
了函数vars
和one_of
函数。但是,它并没有返回我所期望的。
test<-test%>%mutate_at(
vars(one_of("A","B","C","D","E")),
funs(grade=case_when(. %in% c(1,2)~1,
min(.) %in% c(3,4)~2,
min(.) %in% c(5,6,7,8)~3)))
test
A B C D E A_grade B_grade C_grade D_grade E_grade
1 4 8 6 7 5 NA 3 3 3 3
2 7 8 5 8 7 NA 3 3 3 3
3 4 6 6 7 8 NA 3 3 3 3
4 1 5 7 5 5 1 3 3 3 3
5 4 8 5 8 5 NA 3 3 3 3
感谢您的帮助。
解决方案
您可以使用新版本dplyr
、安装方式remotes::install_github("tidyverse/dplyr")
和新版本c_across
轻松获得您想要的东西。请注意,结果没有 3 因为我将您的逻辑解释为> 5
而不是>= 5
.
library(dplyr)
test<-data.frame(A=c(4,7,4,1,4),
B=c(8,8,6,5,8),
C=c(6,5,6,7,5),
D=c(7,8,7,5,8),
E=c(5,7,8,5,5))
test %>%
rowwise() %>%
mutate(grade = case_when(
sum(c_across(A:E) < 2) > 0 ~ 1,
sum(c_across(A:E) > 5) == 5 ~ 3,
TRUE ~ 2
))
#> # A tibble: 5 x 6
#> # Rowwise:
#> A B C D E grade
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 4 8 6 7 5 2
#> 2 7 8 5 8 7 2
#> 3 4 6 6 7 8 2
#> 4 1 5 7 5 5 1
#> 5 4 8 5 8 5 2
推荐阅读
- sql - Azure 数据仓库 生成串行更快的查询
- javascript - 将两个多维数组合并成一个新的多维数组
- mysql - 获取列表中的值计数(MySQL)
- javascript - 在 O(n) 时间内对 (1,2,3) 个数字的数组进行排序
- azure - 在 Azure AD B2C 中对 React React Native 应用程序进行授权
- javascript - 如何像段落一样设置日期选择器输入的样式?
- python - 如何从我的代码、Keras、python 中获取聚类数据(y_true、y_pred)
- amazon-web-services - 如何构建只有一个 EC2 实例的 CloudFormation 和 Elastic Beanstalk 解决方案?
- quotes - 搜索要搜索的字段包含单引号的sql数据库
- struct - Google Bigquery 上的聚合聚合