根据 tibbles 之间字符串的部分匹配创建列
Create column based on partial match of strings between tibbles
我有这些问题:
library(tidyverse)
data <- tribble(
~code, ~v1, ~v2, ~v3,
'ENSG00000141510.14', 10, 20, 30,
'ENSG00000133703.10', 15, 90, 50,
'ENSG00000187848.11', 18, 17, 16,
'ENSG00000133703.10', 55, 47, 22
)
code_info <- tribble(
~code, ~name,
'ENSG00000141510', 'p53',
'ENSG00000133703', 'KRAS',
'ENSG00000187848', 'P2XR2'
)
我想通过比较列 data$code
和 code_info$code
创建一个新列 data$name
。从这个意义上说,code_info
tibble 有点像 key:value 对 data$code
.
中的字符串
data
中的每一行的 name
列等于 code_info
中的 name
列,其字符串 code_info$code
中的部分字符串data$code
.
中的那个
在此示例中,预期结果为:
# A tibble: 4 x 5
code v1 v2 v3 name
<chr> <dbl> <dbl> <dbl> <chr>
1 ENSG00000141510.14 10 20 30 p53
2 ENSG00000133703.10 15 90 50 KRAS
3 ENSG00000187848.11 18 17 16 P2XR2
4 ENSG00000133703.10 55 47 22 KRAS
到目前为止,我一直在通过在 mutate
中手动硬编码一堆顺序 str_replace
来做到这一点,例如:
data %>%
mutate(
name = str_replace(code, "ENSG00000141510.14", "p53"),
name = str_replace(name, "ENSG00000133703.10", "KRAS"),
name = str_replace(name, "ENSG00000187848.11", "P2XR2")
)
# output:
# # A tibble: 4 x 5
# code v1 v2 v3 name
# <chr> <dbl> <dbl> <dbl> <chr>
# 1 ENSG00000141510.14 10 20 30 p53
# 2 ENSG00000133703.10 15 90 50 KRAS
# 3 ENSG00000187848.11 18 17 16 P2XR2
# 4 ENSG00000133703.10 55 47 22 KRAS
这可以解决问题,但显然可扩展性不是很好。有没有办法将信息合并到 code_info
中,以便自动完成,而无需对替换值进行硬编码?
尝试使用 left_join()
和 separate()
来创建数据集之间的公共变量:
library(tidyverse)
#Data
data <- tribble(
~code, ~v1, ~v2, ~v3,
'ENSG00000141510.14', 10, 20, 30,
'ENSG00000133703.10', 15, 90, 50,
'ENSG00000187848.11', 18, 17, 16,
'ENSG00000133703.10', 55, 47, 22
)
code_info <- tribble(
~code, ~name,
'ENSG00000141510', 'p53',
'ENSG00000133703', 'KRAS',
'ENSG00000187848', 'P2XR2'
)
#Code
data2 <- data %>% mutate(Dup=code) %>%
separate(Dup,c('V1','V2'),sep = '\.') %>% select(-V2) %>%
left_join(code_info %>% rename(V1=code)) %>% select(-V1)
输出:
# A tibble: 4 x 5
code v1 v2 v3 name
<chr> <dbl> <dbl> <dbl> <chr>
1 ENSG00000141510.14 10 20 30 p53
2 ENSG00000133703.10 15 90 50 KRAS
3 ENSG00000187848.11 18 17 16 P2XR2
4 ENSG00000133703.10 55 47 22 KRAS
我有这些问题:
library(tidyverse)
data <- tribble(
~code, ~v1, ~v2, ~v3,
'ENSG00000141510.14', 10, 20, 30,
'ENSG00000133703.10', 15, 90, 50,
'ENSG00000187848.11', 18, 17, 16,
'ENSG00000133703.10', 55, 47, 22
)
code_info <- tribble(
~code, ~name,
'ENSG00000141510', 'p53',
'ENSG00000133703', 'KRAS',
'ENSG00000187848', 'P2XR2'
)
我想通过比较列 data$code
和 code_info$code
创建一个新列 data$name
。从这个意义上说,code_info
tibble 有点像 key:value 对 data$code
.
data
中的每一行的 name
列等于 code_info
中的 name
列,其字符串 code_info$code
中的部分字符串data$code
.
在此示例中,预期结果为:
# A tibble: 4 x 5
code v1 v2 v3 name
<chr> <dbl> <dbl> <dbl> <chr>
1 ENSG00000141510.14 10 20 30 p53
2 ENSG00000133703.10 15 90 50 KRAS
3 ENSG00000187848.11 18 17 16 P2XR2
4 ENSG00000133703.10 55 47 22 KRAS
到目前为止,我一直在通过在 mutate
中手动硬编码一堆顺序 str_replace
来做到这一点,例如:
data %>%
mutate(
name = str_replace(code, "ENSG00000141510.14", "p53"),
name = str_replace(name, "ENSG00000133703.10", "KRAS"),
name = str_replace(name, "ENSG00000187848.11", "P2XR2")
)
# output:
# # A tibble: 4 x 5
# code v1 v2 v3 name
# <chr> <dbl> <dbl> <dbl> <chr>
# 1 ENSG00000141510.14 10 20 30 p53
# 2 ENSG00000133703.10 15 90 50 KRAS
# 3 ENSG00000187848.11 18 17 16 P2XR2
# 4 ENSG00000133703.10 55 47 22 KRAS
这可以解决问题,但显然可扩展性不是很好。有没有办法将信息合并到 code_info
中,以便自动完成,而无需对替换值进行硬编码?
尝试使用 left_join()
和 separate()
来创建数据集之间的公共变量:
library(tidyverse)
#Data
data <- tribble(
~code, ~v1, ~v2, ~v3,
'ENSG00000141510.14', 10, 20, 30,
'ENSG00000133703.10', 15, 90, 50,
'ENSG00000187848.11', 18, 17, 16,
'ENSG00000133703.10', 55, 47, 22
)
code_info <- tribble(
~code, ~name,
'ENSG00000141510', 'p53',
'ENSG00000133703', 'KRAS',
'ENSG00000187848', 'P2XR2'
)
#Code
data2 <- data %>% mutate(Dup=code) %>%
separate(Dup,c('V1','V2'),sep = '\.') %>% select(-V2) %>%
left_join(code_info %>% rename(V1=code)) %>% select(-V1)
输出:
# A tibble: 4 x 5
code v1 v2 v3 name
<chr> <dbl> <dbl> <dbl> <chr>
1 ENSG00000141510.14 10 20 30 p53
2 ENSG00000133703.10 15 90 50 KRAS
3 ENSG00000187848.11 18 17 16 P2XR2
4 ENSG00000133703.10 55 47 22 KRAS