当另一列值高于 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_sapiens
当 COL2 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
我有一个数据框,例如;
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_sapiens
当 COL2 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