r - 分组数据中的 if 语句
问题描述
我正在尝试根据列'class'
的条件将新列添加到我的数据中。我构建了用户定义的函数class_fun
来创建这个新列。
如果条件匹配,我尝试将整个子组设置为相同的值。但是我还没有成功!
test=data.frame(set=as.numeric(gl(3,6)),gr = rep(letters[1:2],each=3),vals=c(c(10,10, 9, 8, 1,1),c(10,10,10, 9,6,2),c(10,7,6,1,1,2)))
> test
set gr vals
1 1 a 10
2 1 a 10
3 1 a 9
4 1 b 8
5 1 b 1
6 1 b 1
7 2 a 10
8 2 a 10
9 2 a 10
10 2 b 9
11 2 b 6
12 2 b 2
13 3 a 10
14 3 a 7
15 3 a 6
16 3 b 1
17 3 b 1
18 3 b 2
这是用于创建名为 的新列的函数class
。
class_fun <- function(gr,set,vals){
if(any(grepl("a|b",gr)&set==vals)){
"catched"
}
else{
NA
}
}
library(dplyr)
test%>%
group_by(set,gr)%>%
mutate(class=class_fun(gr,set,vals))
这使
# A tibble: 18 x 4
# Groups: set, gr [6]
set gr vals class
<dbl> <fct> <dbl> <lgl>
1 1 a 10 NA
2 1 a 10 NA
3 1 a 9 NA
4 1 b 8 NA
5 1 b 1 NA
6 1 b 1 NA
7 2 a 10 NA
8 2 a 10 NA
9 2 a 10 NA
10 2 b 9 NA
11 2 b 6 NA
12 2 b 2 NA
13 3 a 10 NA
14 3 a 7 NA
15 3 a 6 NA
16 3 b 1 NA
17 3 b 1 NA
18 3 b 2 NA
我所期待的是
# A tibble: 18 x 4
# Groups: set, gr [6]
set gr vals class
<dbl> <fct> <dbl> <lgl>
1 1 a 10 NA
2 1 a 10 NA
3 1 a 9 NA
4 1 b 8 catched
5 1 b 1 catched
6 1 b 1 catched
7 2 a 10 NA
8 2 a 10 NA
9 2 a 10 NA
10 2 b 9 catched
11 2 b 6 catched
12 2 b 2 catched
13 3 a 10 NA
14 3 a 7 NA
15 3 a 6 NA
16 3 b 1 NA
17 3 b 1 NA
18 3 b 2 NA
任何想法或解决方案为什么会发生这种情况?谢谢!
解决方案
我觉得没必要写函数。
test%>%group_by(set,gr)%>%mutate(calss=ifelse(any(stringr::str_detect(gr,'a|b')&(set==vals)),'catched',NA)
+ )
# A tibble: 18 x 4
# Groups: set, gr [6]
set gr vals calss
<dbl> <fctr> <dbl> <chr>
1 1 a 10 <NA>
2 1 a 10 <NA>
3 1 a 9 <NA>
4 1 b 8 catched
5 1 b 1 catched
6 1 b 1 catched
7 2 a 10 <NA>
8 2 a 10 <NA>
9 2 a 10 <NA>
10 2 b 9 catched
11 2 b 6 catched
12 2 b 2 catched
13 3 a 10 <NA>
14 3 a 7 <NA>
15 3 a 6 <NA>
16 3 b 1 <NA>
17 3 b 1 <NA>
18 3 b 2 <NA>
推荐阅读
- scala - Scala 中的 Apache Spark 配置
- react-native - 使用嵌套堆栈和抽屉导航器反应导航
- c++ - 从基类获取附加功能
- python - 如何在 django 视图中运行测试而不影响数据库
- php - 用户有什么方法可以从(数据库)他们在codeigniter中的配置文件设置中设置时区?
- java - 如何使用 JPA 从函数 SUM 中获取参考字段名称的值
- java - Teamcity 使用外部 Maven
- python - 如何同时从配置中获取多个变量?
- selenium - 使用 Proguard 混淆基于 Appium 的 jar 时重复类定义
- jquery - 如何将链接附加到第三个
- 在班级的第三次出现