【问题标题】:Accessing relational data with dplyr使用 dplyr 访问关系数据
【发布时间】:2021-06-18 01:36:21
【问题描述】:

给定以下数据框data

set.seed(123)
data <- data.frame(ID = c(1,1,1,2,2,2),
                   Loc = rep(paste("Loc", seq(1:3), sep = "")),
                   Var  = rnorm(6))

我们可以使用dplyr::group_bydplyr::mutate 创建一个新列,显示每个Var 的最大值ID

library(dplyr)
data%>%
  group_by(ID)%>%
  mutate(MaxVar = max(Var))

如果我们想要创建另一个新列(我们将其称为MaxVarLoc)以显示与每个MaxVar 相关联的Loc ID

结果如下所示:

ID Loc     Var           MaxVar      MaxVarLoc

1   Loc1    -0.56047565 1.558708    LOC3
1   Loc2    -0.23017749 1.558708    LOC3    
1   Loc3    1.55870831  1.558708    LOC3    
2   Loc1    0.07050839  1.715065    LOC3    
2   Loc2    0.12928774  1.715065    LOC3    
2   Loc3    1.71506499  1.715065    LOC3    
#The result just happens to be `Loc3` in both cases here

我们如何在dplyr 框架中以这种方式访问​​关系数据(即,为每个ID 指定哪个LocVar 的最大值对应)?

【问题讨论】:

    标签: r filter dplyr


    【解决方案1】:

    我们需要which.max 来返回“最大行”的索引并根据该索引选择“Loc”

    library(dplyr)
    data %>%
         group_by(ID) %>%
         mutate(MaxVar = max(Var), MaxVarLoc = Loc[which.max(Var)]) %>%
         ungroup
    

    最好先创建which.max 索引,然后使用它来提取“Var”和“Loc”元素

    data %>%
        group_by(ID) %>%
        mutate(imx = which.max(Var), 
              MaxVar = Var[imx], MaxVarLoc = Loc[imx], imx = NULL) %>%
        ungroup
    

    -输出

    # A tibble: 6 x 5
         ID Loc       Var MaxVar MaxVarLoc
      <dbl> <chr>   <dbl>  <dbl> <chr>    
    1     1 Loc1  -0.560    1.56 Loc3     
    2     1 Loc2  -0.230    1.56 Loc3     
    3     1 Loc3   1.56     1.56 Loc3     
    4     2 Loc1   0.0705   1.72 Loc3     
    5     2 Loc2   0.129    1.72 Loc3     
    6     2 Loc3   1.72     1.72 Loc3     
    

    或者可以在across中使用

    data %>% 
        group_by(ID) %>%
        mutate(i1 = which.max(Var),
           across(Loc:Var, ~ .[i1], .names = 'Max{.col}'), i1 = NULL) %>%
        ungroup
    

    或者我们可以使用slice_max 分割最大行并进行连接

    library(stringr)
    data %>%
         group_by(ID) %>% 
         slice_max(n = 1, order_by = Var) %>% 
         ungroup %>% 
         rename_with(~ str_c('Max', .), -ID) %>% 
         right_join(data)
    

    【讨论】:

      猜你喜欢
      • 2018-01-11
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      相关资源
      最近更新 更多