tidyverse 中字符串变量的条件连接

Conditional concatenation of string variables in tidyverse

我正在尝试使用 tidyverse 有条件地连接字符串变量。

这是玩具数据

df <- tibble(id = paste0("id_", 1:4),
             outcome = rep(x = c("simon",
                                 "garfunkel"),
                           times = 2),
             worth = rep(x = c("awesome",
                               "disposable"),
                         times = 2))

df

#   id    outcome   worth     
#   <chr> <chr>     <chr>     
# 1 id_1  simon     awesome   
# 2 id_2  garfunkel disposable
# 3 id_3  simon     awesome   
# 4 id_4  garfunkel disposable

我可以使用 tidyr 中的 unite() 像这样组合 id 列和 'worth' 列

df %>%
  unite("id", c(id, worth))

#   id              outcome  
#   <chr>           <chr>    
# 1 id_1_awesome    simon    
# 2 id_2_disposable garfunkel
# 3 id_3_awesome    simon    
# 4 id_4_disposable garfunkel

但是这有一些问题,输出有一些问题,我生成它的方式也有一些问题。

首先,我想保留原始列,而 unite() 只是连接两列 。我在 mutate 中尝试了 unite 但这产生了一个错误。

其次,也是最重要的,而不是简单地连接一个列,我想使新的并列 id 列成为 id 列和 worth 列,但 outcome . 为条件我尝试在 mutate() 中使用 case_when() 来做到这一点,但我很困惑 paste0() 函数 and/or 是否可以在 case_when() 中使用 unite() .

第三,与第二点相关,我只需要将 worth 列的 部分 连接到 id column. 理想情况下使用正则表达式替换,仅捕获 worth column

的前 x 个字母

基本上我需要新数据集看起来像下面的数据框,但使用条件和字符串连接机制

tibble(id = paste0(paste0("id_", 1:4), 
                   rep(c("_awes", "_disp"))),
       outcome = rep(x = c("simon",
                           "garfunkel"),
                     times = 2),
       worth = rep(x = c("awesome",
                         "disposable"),
                   times = 2))

#   id          outcome   worth     
#   <chr>       <chr>     <chr>     
# 1 id_1_awes   simon     awesome   
# 2 id_2_disp   garfunkel disposable
# 3 id_3_awes   simon     awesome   
# 4 id_4_disp   garfunkel disposable

非常感谢任何帮助。

(p.s。如果您认为加芬克尔也很棒,我们深表歉意)

df %>% 
   mutate(worth1 = substr(worth, 1, 4)) %>%
   unite(id, id, worth1)

# A tibble: 4 x 3
  id        outcome   worth     
  <chr>     <chr>     <chr>     
1 id_1_awes simon     awesome   
2 id_2_disp garfunkel disposable
3 id_3_awes simon     awesome   
4 id_4_disp garfunkel disposable

我举了一个非常令人困惑的例子,正如@camille 指出的那样,它有一些冗余,因为我想作为条件的列遵循与我想提取的列相同的模式,因此不需要完全调理。我只能说是我的错。然而,由于人们已经提供了基于原始的、令人困惑的数据集的解决方案,我将按原样保留示例。根据他们的回答,以下是我正在寻找的内容

df %>%
  mutate(newid = case_when(outcome == "simon" ~ paste(id, substr(worth, 1, 4), sep = "_"),
                           outcome == "garfunkel" ~ paste(id, substr(worth, 1, 4), sep = "_")))

#   id    outcome   worth      newid    
#   <chr> <chr>     <chr>      <chr>    
# 1 id_1  simon     awesome    id_1_awes
# 2 id_2  garfunkel disposable id_2_disp
# 3 id_3  simon     awesome    id_3_awes
# 4 id_4  garfunkel disposable id_4_disp

此解决方案以 outcome 变量为条件,但 提取 worth 变量的前四个字符并将其与 `id 变量组合。感谢响应者帮助我解决这个问题。