Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 对数据应用简单函数_R_If Statement_Dplyr - Fatal编程技术网

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
条件中它是大写的b
bad
@Masoud,这很简单。我只关心组是否正确当id==bad时,number等于minimum
count
。然后当我们对数据分组时,满足此条件的组是
红旗
否则
绿旗
@JilberUrbina哦,对不起,我更正了!当id==bad时,minimum
count
我不清楚。您想要
的最小值吗>对那些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))