通过条件为R中同一组的所有成员分配逻辑值

问题描述 投票:0回答:1

我有以下数据框:

families <- data.frame(family=c('1', '1', '1', '2', '2', '3', '3'),
                             name=c('John', 'Anitta', 'Steven', 'Stella', 'Robert', 'Adam', 'William'),
                             role=c('Leader', 'Partner', 'Son', 'Leader', 'Son', 'Leader', 'Partner'))
print(families)

# A tibble: 7 × 3
# Groups:   family [3]
  family name    role   
  <chr>  <chr>   <chr>  
1 1      John    Leader 
2 1      Anitta  Partner
3 1      Steven  Son    
4 2      Stella  Leader 
5 2      Robert  Son    
6 3      Adam    Leader 
7 3      William Partner

我想要创建一个名为“夫妇”的变量,如果检测到角色为“伴侣”的家庭成员存在,它将为同一家庭的所有成员分配 TRUE 或 FALSE 值。我希望它看起来像这样:

  family    name    role couple
1      1    John  Leader   TRUE
2      1  Anitta Partner   TRUE
3      1  Steven     Son   TRUE
4      2  Stella  Leader  FALSE
5      2  Robert     Son  FALSE
6      3    Adam  Leader   TRUE
7      3 William Partner   TRUE

我尝试使用 group_by() 函数,然后使用 mutate() 和 case_when() 函数来实现此目的,但我得到了这个结果:

families <- families %>% 
  group_by(family)

families <- families %>% 
  mutate(
    couple = case_when(
      role == 'Partner' ~ TRUE,
      TRUE ~ FALSE
    )
  )

print(families)

# A tibble: 7 × 4
# Groups:   family [3]
  family name    role    couple
  <chr>  <chr>   <chr>   <lgl> 
1 1      John    Leader  FALSE 
2 1      Anitta  Partner TRUE  
3 1      Steven  Son     FALSE 
4 2      Stella  Leader  FALSE 
5 2      Robert  Son     FALSE 
6 3      Adam    Leader  FALSE 
7 3      William Partner TRUE  
r rstudio grouping
1个回答
0
投票

使用

dplyr
包,你可以这样做:

library(dplyr)


families <- data.frame(family=c('1', '1', '1', '2', '2', '3', '3'),
                       name=c('John', 'Anitta', 'Steven', 'Stella', 'Robert', 'Adam', 'William'),
                       role=c('Leader', 'Partner', 'Son', 'Leader', 'Son', 'Leader', 'Partner'))

families
#>   family    name    role
#> 1      1    John  Leader
#> 2      1  Anitta Partner
#> 3      1  Steven     Son
#> 4      2  Stella  Leader
#> 5      2  Robert     Son
#> 6      3    Adam  Leader
#> 7      3 William Partner

families |> 
        group_by(family) |> 
        mutate(couple = any(role == "Partner"))
#> # A tibble: 7 × 4
#> # Groups:   family [3]
#>   family name    role    couple
#>   <chr>  <chr>   <chr>   <lgl> 
#> 1 1      John    Leader  TRUE  
#> 2 1      Anitta  Partner TRUE  
#> 3 1      Steven  Son     TRUE  
#> 4 2      Stella  Leader  FALSE 
#> 5 2      Robert  Son     FALSE 
#> 6 3      Adam    Leader  TRUE  
#> 7 3      William Partner TRUE

创建于 2024-04-25,使用 reprex v2.1.0

© www.soinside.com 2019 - 2024. All rights reserved.