【问题标题】:select some values between 2 dataframe在 2 个数据框之间选择一些值
【发布时间】:2021-06-29 11:25:38
【问题描述】:

我有两个数据框,其中一个有一列 100 个基因,另一个数据框有一列包含 700 行,每行有几个用逗号分隔的基因,现在我不知道怎么可能根据数据框 1 中的基因列选择数据框 2 每一行中的基因。换句话说,我希望数据框 2 的每一行中的基因位于数据框 1 的基因列中。

dataframe1:
column gene:
a
b
c
d
e
f

dataframe2:
column gene: 
row1"a,b,c,d,r,t,y"
row2"c,g,h,k,l,a,b,c,p"

我只希望删除 dataframe2 的每一行中的逗号分隔的基因,这些基因位于 dataframe1 的列基因中,而数据框 2 中的其他基因不在 dataframe1 中。

【问题讨论】:

  • 我是 R 的初学者,真的需要你的帮助。提前谢谢你。
  • 接受对你帮助最大的答案是一个好习惯。否则,您可能会犹豫回答您的其他问题。
  • @KarstenW。谢谢你。我不知道我应该接受最符合我的问题的答案之一。我现在为我之前的问题做了。谢谢。

标签: r


【解决方案1】:

使用 tidyverse:

library(tidyverse)
library(rebus)
#> 
#> Attaching package: 'rebus'
#> The following object is masked from 'package:stringr':
#> 
#>     regex
#> The following object is masked from 'package:ggplot2':
#> 
#>     alpha

dataframe1 <- tibble(gene = c("a", "b", "c", "d", "e", "f"))
dataframe2 <- tibble(gene = c("a,b,c,d,r,t,y","c,g,h,k,l,a,b,c,p"))

result <- str_extract_all(dataframe2$gene, rebus::or1(dataframe1$gene)) %>%
            map(~ reduce(.x, str_c, sep = ','))

mutate(dataframe2, gene = result) %>% unnest(c(gene))
#> # A tibble: 2 x 1
#>   gene   
#>   <chr>  
#> 1 a,b,c,d
#> 2 c,a,b,c

reprex package (v2.0.0) 于 2021-06-28 创建

【讨论】:

  • 当我使用你的代码时,我遇到了这个问题。 "" 错误:.x 为空,并且没有提供 .init ""。你能帮我消除这个错误吗?提前谢谢你。
【解决方案2】:

使用sapply 循环遍历dataframe2$gene 的每一行,并仅保留%in% dataframe$gene1 的值,在strspliting 之后获取每个逗号分隔值。

dataframe1 <- data.frame(gene = c("a", "b", "c", "d", "e", "f"),
                         stringsAsFactors=FALSE)
dataframe2 <- data.frame(gene = c("a,b,c,d,r,t,y", "c,g,h,k,l,a,b,c,p"),
                         stringsAsFactors=FALSE)

dataframe2$gene_sub <- sapply(
    strsplit(dataframe2$gene, ","),
    function(x) paste(x[x %in% dataframe1$gene], collapse=",")
)

dataframe2
##               gene gene_sub
##1     a,b,c,d,r,t,y  a,b,c,d
##2 c,g,h,k,l,a,b,c,p  c,a,b,c

【讨论】:

    【解决方案3】:

    使用来自@thelatemail 的数据的tidyverse 选项。

    library(dplyr)
    library(tidyr)
    
    dataframe2 %>%
      mutate(row =  row_number()) %>%
      separate_rows(gene, sep = ',') %>%
      left_join(dataframe1 %>%
                mutate(gene_sub = gene), by = 'gene') %>%
      group_by(row) %>%
      summarise(across(c(gene, gene_sub), ~toString(na.omit(.)))) %>%
      select(-row)
    
    #  gene                      gene_sub  
    #  <chr>                     <chr>     
    #1 a, b, c, d, r, t, y       a, b, c, d
    #2 c, g, h, k, l, a, b, c, p c, a, b, c
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多