我有以下数据结构:
pos.c1<-seq(from=1,to=100,by=1)
map.c1<-seq(from=0,to=1,length.out = 100)
cro.c1<-rep(1,100)
pos.c2<-seq(from=1,to=80,by=1)
map.c2<-seq(from=0,to=1,length.out = 80)
cro.c2<-rep(2,80)
c1<-cbind(cro.c1,pos.c1,map.c1)
c2<-cbind(cro.c2,pos.c2,map.c2)
map<-rbind(c1,c2)
colnames(map)<-c("Chr","Pos","CM")
Pos.1<-c(30,52,60,72,80,4,12,30,40)
Pos.2<-c(40,53,71,79,95,9,20,35,79)
Chr<-c(rep(1,5),rep(2,4))
Data<-cbind(Chr,Pos.1,Pos.2)
两个数据帧。
map:有三个变量。 Chr,Pos和CM。 数据:有三个变量:Chr,Pos.1,Pos.2
将数据$ Pos.2和数据$ Pos.1与地图$ Pos匹配,我需要得到这两个匹配之间的地图$ CM值的差异。此过程需要由$ Chr。
完成作为示例:对于数据的第一行(1,30,40),期望值将是0.1010101(这通过操作0.39393939 -0.29292929获得)。对于Chr = 2(2,4,9)的第一行数据,理想值为0.06468352(0.1026582-0.03797468)。
答案 0 :(得分:1)
我是否理解你的愿望,我认为你必须做这样的事情:
pos.c1<-seq(from=1,to=100,by=1)
map.c1<-seq(from=0,to=1,length.out = 100)
cro.c1<-rep(1,100)
pos.c2<-seq(from=1,to=80,by=1)
map.c2<-seq(from=0,to=1,length.out = 80)
cro.c2<-rep(2,80)
c1<-cbind(cro.c1,pos.c1,map.c1)
c2<-cbind(cro.c2,pos.c2,map.c2)
map<-rbind(c1,c2)
colnames(map)<-c("Chr","Pos","CM")
Pos.1<-c(30,52,60,72,80,4,12,30,40)
Pos.2<-c(40,53,71,79,95,9,20,35,79)
Chr<-c(rep(1,5),rep(2,4))
Data<-cbind(Chr,Pos.1,Pos.2)
使用库tidyverse
library(tidyverse)
您必须将数据转换为数据框:
Data <- as.data.frame(Data)
map <- as.data.frame(map)
然后您只需使用left_join
Data_CM <- left_join(Data,map,by=c("Chr","Pos.1"="Pos")) %>%
rename(CM.1=CM)
Data_CM <- left_join(Data_CM,map,by=c("Chr","Pos.2"="Pos")) %>%
rename(CM.2=CM)
Diff
变量将计算两个检索值之间的差异
Data_CM <- Data_CM %>%
mutate(Diff=(CM.2-CM.1))