处理2个混合数据帧

时间:2016-04-05 14:14:47

标签: r

我有两个数据帧:

> # Create dataframe1
> ID <- c('ID1','ID2','ID3','ID4','ID5','ID6','ID7')
> hr <- c(56,32,38,NA,42,23,35)
> cr <- c(1,4,5,2,2,5,4)
> data1 <- data.frame(ID,hr,cr)
> data1
   ID hr cr
1 ID1 56  1
2 ID2 32  4
3 ID3 38  5
4 ID4 NA  2
5 ID5 42  2
6 ID6 23  5
7 ID7 35  4
> 
> # Create dataframe2
> ID <- c('ID1','ID2','ID5','ID7','ID9','ID6','ID7')
> hr <- c(23,13,15,49,22,24,23)
> cr <- c(1,4,5,2,2,5,4)
> data2 <- data.frame(ID,hr,cr)
> data2
  ID hr cr
1 ID1  23   1
2 ID2  13   4
3 ID5  15   5
4 ID7  49   2
5 ID9  22   2
6 ID6  24   5
7 ID7  23   4

如果列ID和cr中的值在两个数据帧中都匹配,我想将dataframe2$hr列粘贴到数据帧1上(否则粘贴NA),即。如果dataframe1$ID == dataframe2$ID & dataframe1$cr == dataframe2$cr,则将dataframe2$hr的值粘贴到dataframe1中的新列中,如果它们不匹配,则粘贴NA。

这样做的最佳方式是什么?我试过这种方式:

data1$newhr=ifelse(data1$ID%in%data2$ID2 & data1$cr%in%data2$cr2,data2$hr2,"NA")

适用于这个小例子,但是对于我的较大数据帧(尺寸不同),这不起作用。我收到以下错误消息:

  

$<-.data.frame*tmp*,“newP”,值= c(NA,NA,NA,NA,   NA,:         替换有563行,数据有48个

此外,gwascat_highlight$V2 %in% testfull3$gcSNP & gwascat_highlight$V3 %in%中的警告消息:

  

较长的物体长度不是较短物体长度的倍数

我无法重新创建更大的数据框,但有没有其他方法可以执行此任务?

3 个答案:

答案 0 :(得分:2)

我假设数据框中的行必须是相同的顺序。否则,您必须逐行执行检查或使用MD建议的重新排序,例如,t2&lt; - merge(data1,data2,by = c(&#34; ID&#34;,&#34; cr&#34) ;),all.x = TRUE)然后将合并与data1进行比较。

将您的问题分成两部分:

if (compare_dfs(data1,data2)){
  data1$newhr <- data2$hr
} else {
  data1$newhr <-NA
}

然后你需要定义比较方法:

 all(data1[,c("ID","cr")] == data2[,c("ID","cr")])

适用于具有相同维度的dfs。您也可以使用

identical(data1[,c("ID","cr")],data2[,c("ID","cr")])

无论尺寸如何都可以使用。

答案 1 :(得分:1)

使用库dplyr,您可以使用inner_join,如下所示:

library(dplyr)
inner_join(data1, data2, by = c('ID', 'cr'))

输出是:

   ID hr.x cr hr.y
1 ID1   56  1   23
2 ID2   32  4   13
3 ID6   23  5   24
4 ID7   35  4   23

答案 2 :(得分:1)

以下是你想要的吗?

merge(data1, data2, by = c("ID", "cr"), all.x = TRUE)

结果:

   ID cr hr.x hr.y
1 ID1  1   56   23
2 ID2  4   32   13
3 ID3  5   38   NA
4 ID4  2   NA   NA
5 ID5  2   42   NA
6 ID6  5   23   24
7 ID7  4   35   23

使用dplyrdata.table等同样可以实现同样效果。