如何通过比较两个数据集中的列来减去值?

时间:2017-12-23 10:37:45

标签: r dataframe

我有以下数据结构:

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)。

1 个答案:

答案 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))