首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dplyr群体评价同时评价单个项目

dplyr群体评价同时评价单个项目
EN

Stack Overflow用户
提问于 2019-05-06 15:47:51
回答 1查看 35关注 0票数 2
代码语言:javascript
复制
library(tidyverse)
df <- tibble(`Roman Numeral` = c(rep("I", 3), rep("II", 3)),
             Letter = c("A", "B", "C", "D", "E", "F"),
             Value = c(10, 5, 22, 3, 25, 7),
             Threshold = rep(20, 6))

df
#> # A tibble: 6 x 4
#>   `Roman Numeral` Letter Value Threshold
#>   <chr>           <chr>  <dbl>     <dbl>
#> 1 I               A         10        20
#> 2 I               B          5        20
#> 3 I               C         22        20
#> 4 II              D          3        20
#> 5 II              E         25        20
#> 6 II              F          7        20

这是我上面的df数据框架。我需要执行涉及组评估的逻辑,同时对一行进行评估。我不知道这是否有意义。让我在下面列出我想做的事情,希望这是可以理解的。

代码语言:javascript
复制
df.do <- df %>% 
  group_by(`Roman Numeral`) %>% 
  mutate(Violation = **see requested logic**)

下面是所需的输出。如何在tidyverse中执行这三个步骤的逻辑,可能是使用dplyr

代码语言:javascript
复制
df.do  # (desired output)
#> # A tibble: 6 x 4
#>   `Roman Numeral` Letter Value Threshold Violation
#>   <chr>           <chr>  <dbl>     <dbl> <logical>
#> 1 I               A         10        20 TRUE
#> 2 I               B          5        20 TRUE
#> 3 I               C         22        20 TRUE
#> 4 II              D          3        20 FALSE
#> 5 II              E         25        20 FALSE
#> 6 II              F          7        20 FALSE
  1. 分别评估每个Roman Numeral
  2. 对于每个Roman Numeral组,转到带有max()字母的行,并确定Value是否大于Threshold (仅适用于此行)
  3. 如果步骤2(直接在上面)是TRUE,则将该特定组的所有Violation填充为TRUE,否则将填充为FALSE
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-06 15:50:56

由于它已经是arranged,所以提取最后一个“值”

代码语言:javascript
复制
df %>% 
  group_by(`Roman Numeral`) %>%  
  mutate(Violation = last(Value) >= Threshold)
# A tibble: 6 x 5
# Groups:   Roman Numeral [2]
#  `Roman Numeral` Letter Value Threshold Violation
#  <chr>           <chr>  <dbl>     <dbl> <lgl>    
#1 I               A         10        20 TRUE     
#2 I               B          5        20 TRUE     
#3 I               C         22        20 TRUE     
#4 II              D          3        20 FALSE    
#5 II              E         25        20 FALSE    
#6 II              F          7        20 FALSE    

如果不是arranged

代码语言:javascript
复制
df %>% 
  group_by(`Roman Numeral`) %>%  
  mutate(Violation = Value[which.max(factor(Letter))] >= Threshold)
  #or using `dense_rank`
  #mutate(Violation = Value[which.max(dense_rank(Letter))] >= Threshold)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56008532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档