繁体   English   中英

如何在R中匹配data.table中的字符串/字符变量,然后打印到另一列?

[英]How to match string/character variables in a data table in R, then print into another column?

我有一个 data.table,在我的表的一列中包含一组特定的基因,在另一列中包含另一组重要基因。 两者都是字符变量。 我如何找到这些基因的重叠并打印到另一列中?

例子:

a <- c('apple banana melon pear', 'pear kiwi pineapple', 'avocado lime kiwi apple', 'lime pineapple banana melon') b <- c('blah blah blah banana pear', 'blah pear blah blah奇异果','blah blah blah apple','lime blah blah blah') df <- data.frame(a,b)

我要返回的是 df$new_column of c('banana pear', 'pear kiwi', 'apple', 'lime')

我努力了:

df$new_column<- df$a[df$a %in% df$b],但我收到错误消息

$<-.data.frame ( *tmp* , new_column, value = character(0)) 错误:替换有 0 行,数据有 4

这些字符串必须首先被分成单词,然后我们可以在这些集合的对上使用 intersect() 。

使用 base R 可能是这样的:

df <- data.frame(a,b)
# split strings and find intersections, paste back together
df$new_column <- mapply(\(a,b) paste(intersect(a,b), collapse = " ") ,
                        strsplit(df$a, " ",),
                        strsplit(df$b, " ",))
df
#>                             a                          b  new_column
#> 1    apple banana melon pear  blah blah blah banana pear banana pear
#> 2         pear kiwi pineapple   blah pear blah blah kiwi   pear kiwi
#> 3     avocado lime kiwi apple       blah blah blah apple       apple
#> 4 lime pineapple banana melon        lime blah blah blah        lime

# all values are just plain strings:
str(df)
#> 'data.frame':    4 obs. of  3 variables:
#>  $ a         : chr  "apple banana melon pear " "pear kiwi pineapple" "avocado lime kiwi apple" "lime pineapple banana melon"
#>  $ b         : chr  "blah blah blah banana pear" "blah pear blah blah kiwi" "blah blah blah apple" "lime blah blah blah"
#>  $ new_column: chr  "banana pear" "pear kiwi" "apple" "lime"

或者:

library(dplyr, warn.conflicts = F)
library(stringr)
library(purrr)

# with Tidyverse and list columns:
df_lc <- df %>% mutate(across(c(a,b), ~ str_split(.x, " "))) %>% 
  mutate(new_col = map2(a,b, ~ intersect(.x,.y)))

# now we have list columns:
df_lc["new_col"]
#>        new_col
#> 1 banana, pear
#> 2   pear, kiwi
#> 3        apple
#> 4         lime

# when printing a tibble it's bit more evident:
as_tibble(df_lc)
#> # A tibble: 4 × 4
#>   a         b         new_column  new_col  
#>   <list>    <list>    <chr>       <list>   
#> 1 <chr [5]> <chr [5]> banana pear <chr [2]>
#> 2 <chr [3]> <chr [5]> pear kiwi   <chr [2]>
#> 3 <chr [4]> <chr [4]> apple       <chr [1]>
#> 4 <chr [4]> <chr [4]> lime        <chr [1]>

str(df_lc)
#> 'data.frame':    4 obs. of  4 variables:
#>  $ a         :List of 4
#>   ..$ : chr  "apple" "banana" "melon" "pear" ...
#>   ..$ : chr  "pear" "kiwi" "pineapple"
#>   ..$ : chr  "avocado" "lime" "kiwi" "apple"
#>   ..$ : chr  "lime" "pineapple" "banana" "melon"
#>  $ b         :List of 4
#>   ..$ : chr  "blah" "blah" "blah" "banana" ...
#>   ..$ : chr  "blah" "pear" "blah" "blah" ...
#>   ..$ : chr  "blah" "blah" "blah" "apple"
#>   ..$ : chr  "lime" "blah" "blah" "blah"
#>  $ new_column: chr  "banana pear" "pear kiwi" "apple" "lime"
#>  $ new_col   :List of 4
#>   ..$ : chr  "banana" "pear"
#>   ..$ : chr  "pear" "kiwi"
#>   ..$ : chr "apple"
#>   ..$ : chr "lime"

输入:

a <- c('apple banana melon pear ', 'pear kiwi pineapple', 'avocado lime kiwi apple', 'lime pineapple banana melon')
b <- c('blah blah blah banana pear', 'blah pear blah blah kiwi', 'blah blah blah apple', 'lime blah blah blah')

创建于 2023-01-20,使用reprex v2.0.2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM