首页 > 解决方案 > 根据 R 中的两个布尔列值将值保留在列的单行中

问题描述

我在下面给出示例以了解问题

我必须根据“之前”和“之后”列将“已解决”列更改为输入数据框下方。如果前列为 TRUE,后列为 FALSE,则“已解决”列应在每个“坐”列组末尾的一行中包含“名称”列的所有名称。

输入数据框:

id  name    sect    sit    before    after    
23  name23  sec34   sit34  TRUE      FALSE 
28  name28  sec13   sit89  FALSE     FALSE    
12  name12  sec13   sit34  FALSE     FALSE
76  name76  sec45   sit34  FALSE     TRUE     
45  name45  sec56   sit56  FALSE     FALSE       
145 name14  sec65   sit34  TRUE      FALSE
90  name90  sec74   sit56  FALSE     FALSE   
15  name15  sec89   sit89  TRUE      FALSE 
78  name78  sec45   sit56  FALSE     FALSE

预期结果:

id  name    sect    sit    before    after    solved
23  name23  sec34   sit34  TRUE      FALSE     
12  name12  sec13   sit34  FALSE     FALSE
145 name14  sec65   sit34  TRUE      FALSE    
76  name76  sec45   sit34  FALSE     TRUE     name23,name14
45  name45  sec56   sit56  FALSE     FALSE    
78  name78  sec45   sit56  FALSE     FALSE
90  name90  sec74   sit56  FALSE     FALSE    nothing here  
15  name15  sec89   sit89  TRUE      FALSE     
28  name28  sec13   sit89  FALSE     FALSE    name15

标签: r

解决方案


dplyr解决方案

library(dplyr)

df %>%
  group_by(sit) %>%
  arrange(name, .by_group = T) %>% 
  mutate(solved = if_else(row_number() == n(),
                          toString(name[before > after]),
                          NA_character_))

# A tibble: 9 x 7
# Groups:   sit [3]
     id name   sect  sit   before after  solved          
  <int> <fct>  <fct> <fct> <lgl>  <lgl>  <chr>           
1    12 name12 sec13 sit34 FALSE  FALSE  NA             
2   145 name14 sec65 sit34 TRUE   FALSE  NA             
3    23 name23 sec34 sit34 TRUE   FALSE  NA             
4    76 name76 sec45 sit34 FALSE  TRUE   "name14, name23"
5    45 name45 sec56 sit56 FALSE  FALSE  NA             
6    78 name78 sec45 sit56 FALSE  FALSE  NA             
7    90 name90 sec74 sit56 FALSE  FALSE  ""              
8    15 name15 sec89 sit89 TRUE   FALSE  NA             
9    28 name28 sec13 sit89 FALSE  FALSE  "name15"   

推荐阅读