R 对数据应用简单函数
嗨,我尝试对数据应用简单的函数来为组创建R 对数据应用简单函数,r,if-statement,dplyr,R,If Statement,Dplyr,嗨,我尝试对数据应用简单的函数来为组创建sub\u id test = data.frame(gr=gl(2,4), id =rep(c("Good","bad","ugly","dirty"),2), count=c(175,1,13,11, 10,165,10,2)) > test gr id count 1 1 Good 175 2 1 bad 1 3 1 ugly 13 4 1 di
sub\u id
test = data.frame(gr=gl(2,4), id =rep(c("Good","bad","ugly","dirty"),2),
count=c(175,1,13,11, 10,165,10,2))
> test
gr id count
1 1 Good 175
2 1 bad 1
3 1 ugly 13
4 1 dirty 11
5 2 Good 10
6 2 bad 165
7 2 ugly 10
8 2 dirty 2
sub_id
的条件如下
如果组编号等于最小计数
,且当id==bad
时,这些组的子id为红旗
,否则(不满足此条件的其他组)绿旗
所以我写了这个函数
sub_id <- function(gr,count,id){
if (gr==min(count)&id=="bad"){
"red flag"
}
else
"green flag"
}
给我
# A tibble: 8 x 4
# Groups: gr [2]
gr id count color
<fctr> <fctr> <dbl> <chr>
1 1 Good 175 green flag
2 1 bad 1 green flag
3 1 ugly 13 green flag
4 1 dirty 11 green flag
5 2 Good 10 green flag
6 2 bad 165 green flag
7 2 ugly 10 green flag
8 2 dirty 2 green flag
Warning messages:
1: In if (gr == min(count) & id == "Bad") { :
the condition has length > 1 and only the first element will be used
2: In if (gr == min(count) & id == "Bad") { :
the condition has length > 1 and only the first element will be used
#一个tible:8 x 4
#分组:gr[2]
gr id计数颜色
1良好175绿色旗帜
2 1坏1绿旗
3.1.13绿旗
4 1脏11绿旗
5 2良10绿旗
6 2坏165绿旗
7.2.10绿旗
8 2脏2绿旗
警告信息:
1:在if(gr==min(count)&id==Bad)中{
条件的长度大于1,并且只使用第一个元素
2:在if(gr==min(count)&id==Bad)中{
条件的长度大于1,并且只使用第一个元素
预期产出
gr id count color
<fctr> <fctr> <dbl> <chr>
1 1 Good 175 red flag
2 1 bad 1 red flag
3 1 ugly 13 red flag
4 1 dirty 11 red flag
5 2 Good 10 green flag
6 2 bad 165 green flag
7 2 ugly 10 green flag
8 2 dirty 2 green flag
gr id计数颜色
1良好175红旗
2 1坏1红旗
3 1丑陋的13面红旗
4 1脏11红旗
5 2良10绿旗
6 2坏165绿旗
7.2.10绿旗
8 2脏2绿旗
以下内容再现了您的预期输出
test %>%
group_by(gr) %>%
mutate(colour = case_when(
any(id == "bad" & gr == pmin(count)) ~ "red flag",
TRUE ~ "green flag"
))
## A tibble: 8 x 4
## Groups: gr [2]
# gr id count colour
# <fct> <fct> <dbl> <chr>
#1 1 Good 175. red flag
#2 1 bad 1. red flag
#3 1 ugly 13. red flag
#4 1 dirty 11. red flag
#5 2 Good 10. green flag
#6 2 bad 165. green flag
#7 2 ugly 10. green flag
#8 2 dirty 2. green flag
你能更好地解释一下你的情况吗?如果第二行的计数等于2呢?那么第5行到第8行将被标记为红色?而且R是大小写敏感的。在你的
id
变量中bad
是小写的,而在你的if
条件中它是大写的bbad
@Masoud,这很简单。我只关心组是否正确当id==bad时,number等于minimumcount
。然后当我们对数据分组时,满足此条件的组是红旗
否则绿旗
@JilberUrbina哦,对不起,我更正了!当id==bad时,minimumcount
我不清楚。您想要的最小值吗>对那些id==bad
的行进行计数?假设我们有一行id==bad和count==0
那么所有内容都将被标记为绿色?这将非常容易,就像您所做的或使用ifelse
一样,但OP表示希望解决方案具有用户定义的函数。干杯。@Masoud这很容易;just将整件事包装在一个函数中。不确定问题出在哪里。@Alexander您很受欢迎。我添加了一个更新来处理您的评论;请看一看。@Alexander您需要向量化的pmin
而不是标量min
。只需逐步检查第一组的条件:pmin(gr==count)
返回c(FALSE,TRUE,FALSE,FALSE)
;id==“bad”
返回c(FALSE,TRUE,FALSE,FALSE)
;这两个条件的矢量化逻辑AND给出c(FALSE,TRUE,FALSE,FALSE)
,any
然后返回一个整体的TRUE
。这就清楚了吗?@Alexander一点问题都没有。很高兴它清楚了:-)
test %>%
group_by(gr) %>%
mutate(colour = case_when(
any(id == "bad" & gr == pmin(count)) ~ "red flag",
TRUE ~ "green flag"
))
## A tibble: 8 x 4
## Groups: gr [2]
# gr id count colour
# <fct> <fct> <dbl> <chr>
#1 1 Good 175. red flag
#2 1 bad 1. red flag
#3 1 ugly 13. red flag
#4 1 dirty 11. red flag
#5 2 Good 10. green flag
#6 2 bad 165. green flag
#7 2 ugly 10. green flag
#8 2 dirty 2. green flag
sub_id <- function(gr, count, id) {
ifelse(any(gr == pmin(count) & id == "bad"), "red flag", "green flag")
}
test %>%
group_by(gr) %>%
mutate(colour = sub_id(gr, count, id))