当另一列值高于 R 中的阈值时替换列的特定部分

Replace specific part of a column when another column value above a threshold in R

我有一个数据框,例如;

COL1                           COL2
Canis_lupus1                   10
Cattus_cattus2                 10
Betta_splendes3                30
Rattus_domesticus_norvegicus3  20
Canis_lupus_OK                 90
Betta_splendes32               54
Canis_lupus_lupus              18

我想在 COL1 中将每个 Canis_lupus 内容替换为: homo_sapiensCOL2 is < 20

那么我应该得到:

COL1                           COL2
Homos_sapiens1                   10
Cattus_cattus2                 10
Betta_splendes3                30
Rattus_domesticus_norvegicus3  20
Canis_lupus_OK                 90
Betta_splendes32               54
Homo_sapiens_lupus              18

这是 df:

structure(list(COL1 = structure(c(5L, 6L, 1L, 7L, 4L, 2L, 3L), .Label = c("Betta_splendes3", 
"Betta_splendes32", "Canis_lupus_lupus", "Canis_lupus_OK", "Canis_lupus1", 
"Cattus_cattus2", "Rattus_domesticus_norvegicus3"), class = "factor"), 
    COL2 = c(10L, 10L, 30L, 20L, 90L, 54L, 18L)), class = "data.frame", row.names = c(NA, 
-7L))

您可以使用以下解决方案:

library(dplyr)
library(stringr)
library(purrr)

df %>% 
  mutate(COL1 = map2(COL1, COL2, ~ ifelse(str_detect(.x, "Canis_lupus") & .y < 20,
                                   str_replace(.x, "Canis_lupus", "homo_sapiens"), .x)))


                           COL1 COL2
1                 homo_sapiens1   10
2                Cattus_cattus2   10
3               Betta_splendes3   30
4 Rattus_domesticus_norvegicus3   20
5                Canis_lupus_OK   90
6              Betta_splendes32   54
7            homo_sapiens_lupus   18

使用data.table,在i中指定条件,使用sub将'COL1'中的子串'Canis_lupus'替换为'Homo_sapiens'

library(data.table)
setDT(df)[COL2 < 20, COL1 := sub("Canis_lupus", "Homo_sapiens", COL1)]

-输出

df
                            COL1 COL2
1:                 Homo_sapiens1   10
2:                Cattus_cattus2   10
3:               Betta_splendes3   30
4: Rattus_domesticus_norvegicus3   20
5:                Canis_lupus_OK   90
6:              Betta_splendes32   54
7:            Homo_sapiens_lupus   18