我有2个数据表,我想根据列中的某些重叠将它们合并。我当时想做类似的事情
df_3 <-merge(x = df_1,y = df_2,all = TRUE,by.x =“ Loci Start”,by.y =“ Start”)
但是我有一个小问题,因为我要合并的列的格式略有不同。
头(df_1)
Category Chromosome Loci Start Loci End Gene ID Gene Symbol Strand Distance to TSS
1 Intron chr10 047322187 047324337 ENST00000581492 GDF2 + 772
2 5'UTR chr11 064210702 064211489 ENST00000541252 FERMT3 + 3278
3 Intron chr11 128685393 128686512 ENST00000572256 RP11-744N12.3 - 476
4 Intron chr11 128692708 128693199 ENST00000608303 FLI1 + 6418
5 Intron chr12 005989201 005989836 ENST00000261405 VWF - 135157
6 Intron chr12 006036674 006037359 ENST00000261405 VWF - 87659
head(df_2)
Chromosome Start End n_of_interactions stats
1 chr10 47322187 47324337 12 9.68
2 chr11 64210702 64211489 10 7.63
3 chr11 128685393 128686512 12 6.01
4 chr11 128692708 128693199 10 6.51
5 chr12 5989201 5989836 17 5.51
6 chr12 6036674 6037359 11 7.19
df_1$Loci Start
和df_2$Start
基本上是相同的数字,但是在df_1
中,以0开头的数字最多可以填充9位数字。您是否有解决此问题的建议?
谢谢
答案 0 :(得分:2)
您可以在两个数据集中创建一个匹配列,其中包含loci.start / start作为数值向量;这将去除前导0。所以
df_1$merge <- as.numeric(df_1$['Loci Start'])
df_2$merge <- as.numeric(df_2$Start)
df_3 <- merge(x = df_1, y = df_2, all = TRUE, by = 'merge')
答案 1 :(得分:0)
您可以使用str_pad
包中的stringr
在Start
的左侧添加0并将其转换为char,然后合并
答案 2 :(得分:0)
您也可以这样做(删除前导零):
df_1['Loci Start'] = gsub(pattern = '.*0', replacement = '', df_1['Loci Start'])
然后,合并:
df_3 <- merge(x = df_1, y = df_2, all = TRUE, by.x = "Loci Start", by.y = "Start")
答案 3 :(得分:0)
如果您希望能够使用管道系统/ tidyverse
,则可以执行以下操作。
library(tidyverse)
df_1 %>%
mutate(`Loci Start` = as.numeric(`Loci Start`)) %>%
left_join(df_2, by = c("Loci Start" = "Start")) # change for the type of join you want