我有两个数据帧:
> # 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%
中的警告消息:
较长的物体长度不是较短物体长度的倍数
我无法重新创建更大的数据框,但有没有其他方法可以执行此任务?
答案 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
使用dplyr
,data.table
等同样可以实现同样效果。