将 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_join
将 level
添加到 L1HS
和 dplyr
。
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))
我在 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_join
将 level
添加到 L1HS
和 dplyr
。
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))