如何在R中合并2个 Dataframe 并使用以前的 Dataframe 值填充空格

cnwbcb6i  于 2023-05-04  发布在  其他
关注(0)|答案(2)|浏览(204)

我有如下两个数据集:
df1:
| 基因ID|p值|
| --------------|--------------|
| ENSG0000000003|零点零四|
| ENSG00000000419|零点零四|
| ENSG00000111780|零点零零零四|
| ENSG00000093100|0.00004|
df2:
| 基因ID|基因名|
| --------------|--------------|
| ENSG0000000003|TSPAN6|
| ENSG00000000419|DPM1|
| ENSG00000111780||
| ENSG00000093100||
我想通过gene_id列连接两个 Dataframe ,并用相应的gene_id填充gene_name空白。
我希望得到的结果如下:
| 基因ID|p值|基因名|
| --------------|--------------|--------------|
| ENSG0000000003|零点零四|TSPAN6|
| ENSG00000000419|零点零四|DPM1|
| ENSG00000111780|零点零零零四|ENSG00000111780|
| ENSG00000093100|0.00004|ENSG00000093100|
我如何在R中最好使用dplyr(或tidyverse)得到上述结果?
我尝试使用left_join,但在gene_name中有未填充的空格。

new_df <- left_join(df1, df2, by = "gene_id")
kse8i1jr

kse8i1jr1#

在你做了连接之后,就用这个。它将检查空值并将该行的gene_id放入gene_name中:

new_df$gene_name <- ifelse(df$gene_name == '',df$gene_id,df$gene_name)
9gm1akwq

9gm1akwq2#

Tidyverse解决方案:我们可以在用NA替换空字符后使用coalesce,也可以使用replace

library(dplyr)

left_join(df1, df2, by = "gene_id") %>%
    mutate(gene_name = na_if(gene_name, "")) %>%
    mutate(gene_name = coalesce(gene_name, gene_id)

#or

left_join(df1, df2, by = "gene_id") %>%
    mutate(gene_name = replace(gene_name,
                         gene_name == "",
                         gene_id[gene_name == ""]
                         )
           )

示例数据

df  <- tibble(id = paste0("some_string_",1:3), dat = c("bob", "mike", ""))

# A tibble: 3 × 2
  id            dat   
  <chr>         <chr> 
1 some_string_1 "bob" 
2 some_string_2 "mike"
3 some_string_3 ""

示例解决方案

df %>% 
    mutate(dat = na_if(dat, "")) %>% 
    mutate(dat = coalesce(dat, as.character(id)))

# A tibble: 3 × 2
  id            dat          
  <chr>         <chr>        
1 some_string_1 bob          
2 some_string_2 mike         
3 some_string_3 some_string_3

相关问题