如何基于具有多个条件的其他列添加列

时间:2020-11-11 08:11:53

标签: r dataframe stringr

我有一个数据框。我想编写条件来创建依赖于其他列的列。在这里:

tab <- tibble::tribble(
  ~dataset_id,  ~type,
     "Site4H",      268,
     "Site4D",      479,
     "SIte8H",      345,
     "Site8D",      567,
     "Site8K",      blond507
  )
library(dplyr)
tab %>%
  mutate(state = case_when(
    endsWith(dataset_id, "H") ~ "healthy",
    endsWith(dataset_id, "D") ~ "disease",
    TRUE                      ~ NA_character_
  ))

如您所见,如果列dataset_id中的值以H结尾,则列状态等于健康。但是我希望它在两种情况下是健康的:当dataset_id列中的值以H结尾并且当“类型”列中的值以“ blond”开头时”。我该怎么办?我需要使用这些确切的函数,因此使用其他库解决方案不好。

所需的结果是:

dataset_id   type          state  
 Site4H       268         healthy
 Site4D       479         disease
 SIte8H       345         healthy
 Site8D       567         disease
 Site8K       blond507    healthy  

1 个答案:

答案 0 :(得分:0)

tab <- tibble::tribble(
  ~dataset_id,  ~type,
  "Site4H",      "268",
  "Site4D",      "479",
  "SIte8H",      "345",
  "Site8D",      "567",
  "Site8K",      "blond507"
)

tab %>%
  mutate(state = case_when(
    endsWith(dataset_id, "H") | startsWith(type, "blond") ~ "healthy",
    endsWith(dataset_id, "D") ~ "disease",
    TRUE                      ~ NA_character_
  ))

因此,您只需在case_when代码中添加类型限制即可:

# A tibble: 5 x 3
  dataset_id type     state  
  <chr>      <chr>    <chr>  
1 Site4H     268      healthy
2 Site4D     479      disease
3 SIte8H     345      healthy
4 Site8D     567      disease
5 Site8K     blond507 healthy

两个注意事项:

  1. 我假设如果id的结尾为“ H”或类型为“ blond507”,则您要编写“健康”代码,尽管您在帖子中说过它应该为“ and”。
  2. 您已编辑代码,因此类型507现在为“ blond507”。请注意,这将不起作用,因为其他值是整数或双精度值,而“ blond507”将是一个字符。因此,您需要调整标签的输入代码(请参阅我的文章的开头)。