将 for 循环中的值粘贴到数据框 R

Paste value from for loop into data frame R

我在 R 中有两个数据帧,recurrent 和 L1HS。我正在尝试找到一种方法来做到这一点:

如果循环中的序列与 L1HS 中的序列匹配,则将循环中列中的值粘贴到 L1HS 中的新列中。

循环数据框如下所示:

> head(recurrent)
    chr     start       end X  Y level                   unique
1: chr4  56707846  56708347 0 38    03   chr4_56707846_56708347
2: chr1  20252181  20252682 0 37    03   chr1_20252181_20252682
3: chr2 224560903 224561404 0 37    03 chr2_224560903_224561404
4: chr5 131849595 131850096 0 36    03 chr5_131849595_131850096
5: chr7  46361610  46362111 0 36    03   chr7_46361610_46362111
6: chr1  20251169  20251670 0 36    03   chr1_20251169_20251670

L1HS 数据集包含许多包含基因序列碱基对的列和一个“序列”列,希望在循环数据框中与“唯一”有一些匹配,如下所示:

> head(L1HS$Sequence)
"chr1_35031657_35037706" 
"chr1_67544575_67550598" 
"chr1_81404889_81410942" 
"chr1_84518073_84524089"
"chr1_87144764_87150794"

我知道如何使用

搜索匹配项
test <- recurrent$unique %in% L1HS$Sequence

获取布尔值:

> head(test)
[1] FALSE FALSE FALSE FALSE FALSE FALSE

但是这里有几个问题。如果找到序列,我想将循环数据集中的“级别”值复制到新列中的 L1HS 数据集。例如,如果在全长数据中找到循环数据中的序列“chr4_56707846_56708347”,我希望全长数据框看起来像:

Sequence                level    other_columns
chr4_56707846_56708347   03     gggtttcatgaccc....

我正在考虑尝试类似的方法:

for (i in L1HS){
   if (recurrent$unique %in% L1HS$Sequence{
     L1HS$level <- paste(recurrent$level[i])}
}

但这当然行不通,我想不通。

我想知道最好的方法是什么!我想知道 merge/intersect/apply 是否可能是 easier/better,或者对于这样一个有点简单的问题,最佳实践可能是什么样的。我为 Python/pandas 找到了一些类似的例子,但我被困在这里了。

提前致谢!

您可以做一个简单的 left_joinlevel 添加到 L1HSdplyr

library(dplyr)

L1HS %>%
  left_join(., recurrent %>% select(unique, level), by = c("Sequence" = "unique"))

merge:

merge(x=L1HS,y=recurrent[, c("unique", "level")], by.x = "Sequence", by.y = "unique",all.x=TRUE)

输出

                Sequence level
1 chr1_35031657_35037706     4
2 chr1_67544575_67550598     2
3 chr1_81404889_81410942    NA
4 chr1_84518073_84524089     3
5 chr1_87144764_87150794    NA

*注意:这仍将保留 L1HS 中的所有列。我只是没有在下面的示例数据中创建任何其他列。

数据

recurrent <- structure(list(chr = c("chr4", "chr1", "chr2", "chr5", "chr7", 
"chr1"), start = c(56707846L, 20252181L, 224560903L, 131849595L, 
46361610L, 20251169L), end = c(56708347L, 20252682L, 224561404L, 
131850096L, 46362111L, 20251670L), X = c(0L, 0L, 0L, 0L, 0L, 
0L), Y = c(38L, 37L, 37L, 36L, 36L, 36L), level = c(3L, 2L, 3L, 
3L, 3L, 4L), unique = c("chr4_56707846_56708347", "chr1_67544575_67550598", 
"chr2_224560903_224561404", "chr5_131849595_131850096", "chr1_84518073_84524089", 
"chr1_35031657_35037706")), class = "data.frame", row.names = c(NA, 
-6L))

L1HS <- structure(list(Sequence = c("chr1_35031657_35037706", "chr1_67544575_67550598", 
"chr1_81404889_81410942", "chr1_84518073_84524089", "chr1_87144764_87150794"
)), class = "data.frame", row.names = c(NA, -5L))