代码之家  ›  专栏  ›  技术社区  ›  Grubbmeister

如何在组中应用条件

  •  1
  • Grubbmeister  · 技术社区  · 6 年前

    我有以下数据:

      Group Hormone Damage    Score Greater   
     1 B     control damaged       4       1        
     2 B     control undamaged     4       1        
     3 B     JA      damaged       2       0       
     4 B     JA      undamaged     3       0  
     5 D     control damaged       2       0        
     6 D     control undamaged     1       0        
     7 D     JA      damaged       4       1        
     8 D     JA      undamaged     3       1        
    

    我该如何创建一些代码来为我执行此操作?我尝试了以下dplyr代码,但没有成功:

    df%>% group_by(Group) %>% 
      mutate(Greater1 = if_else(Score>Score, 0,1))
    

    3 回复  |  直到 6 年前
        1
  •  6
  •   Sotos    6 年前

    如果你对领带没有意见,你可以

    library(tidyverse)
    
    df %>% 
     group_by(Group, Damage) %>% 
     mutate(new = as.integer(Score == max(Score)))
    

    它给予

    # A tibble: 8 x 6
    # Groups:   Group, Damage [4]
      Group Hormone Damage    Score Greater   new
      <chr> <chr>   <chr>     <int>   <int> <int>
    1 B     control damaged       4       1     1
    2 B     control undamaged     4       1     1
    3 B     JA      damaged       2       0     0
    4 B     JA      undamaged     3       0     0
    5 D     control damaged       2       0     0
    6 D     control undamaged     1       0     0
    7 D     JA      damaged       4       1     1
    8 D     JA      undamaged     3       1     1
    
        2
  •  3
  •   Ronak Shah    6 年前

    基R选项使用 ave

    df$Greater <- with(df, as.numeric(Score == ave(Score, Group, Damage, FUN = max)))
    
    df
    #  Group Hormone    Damage Score Greater
    #1     B control   damaged     4       1
    #2     B control undamaged     4       1
    #3     B      JA   damaged     2       0
    #4     B      JA undamaged     3       0
    #5     D control   damaged     2       0
    #6     D control undamaged     1       0
    #7     D      JA   damaged     4       1
    #8     D      JA undamaged     3       1
    

    df$Greater <- with(df, ave(Score, Group, Damage, FUN = function(x) x == max(x)))
    

    或者继续 if_else 你尝试的方法

    library(dplyr)
    df%>% 
      group_by(Group, Damage) %>% 
      mutate(Greater1 = if_else(Score==max(Score), 1,0))
    
        3
  •  0
  •   akrun    6 年前

    使用 data.table

    library(data.table)
    setDT(df)[, new := as.integer(Score == max(Score)), .(Group, Damage)]