合并来自不同数据框的列

时间:2012-01-06 13:44:17

标签: r join merge dataframe

我有问题......

我有两个数据框

>anna1
     name   from       to        result
     11     66607     66841       0
     11     66846     67048       0
     11     67053     67404       0
     11     67409     68216       0
     11     68221     68786       0
     11     68791     69020       0
     11     69025     69289       0
     11     69294     70167       0
     11     70172     70560       0

,第二个数据框是

>anna2
     name   from      to       result
     11     66607     66841       5
     11     66846     67048       6 
     11     67409     68216       7
     11     69025     69289       12
     11     70172     70560       45

我想要的是创建一个与anna1类似的新数据框,其中所有0值将被anna2中正确行中的正确结果替换

你会注意到在anna2数据框中,from和to列只有一些相同的值与anna1数据框中的相应值 ....中间人缺失

所以我需要以某种方式从anna2中的结果列中取出数字并将它们放在anna1中的正确行中

提前谢谢

祝你好运 安娜

4 个答案:

答案 0 :(得分:2)

更简单的merge

anna3 <-merge(anna2,anna1[,1:3], all.y=TRUE)
anna3[is.na(anna3)] <- 0

给出:

> anna3
  name  from    to result
1   11 66607 66841      5
2   11 66846 67048      6
3   11 67053 67404      0
4   11 67409 68216      7
5   11 68221 68786      0
6   11 68791 69020      0
7   11 69025 69289     12
8   11 69294 70167      0
9   11 70172 70560     45

答案 1 :(得分:1)

如果确保“from”列在anna1和anna2中都是唯一的,并且anna2中的每一行在anna1中都有一个匹配的行(虽然反之亦然),一个简单的解决方案是

row.index = function(d) which(anna1$from == d)[1]
indices = sapply(anna2$from, row.index)
anna1$result[indices] = anna2$result

答案 2 :(得分:1)

另一种方法

require(plyr)
anna <- rbind(anna1, anna2)
ddply(anna, .(name, from, to), summarize, result = sum(result))

EDIT。如果数据框很大,速度是个问题,请考虑使用data.table

require(data.table)
data.table(anna)[,list(result = sum(result)),'name, from, to']

答案 3 :(得分:0)

您可以使用merge,但必须明确指定应对两个result列执行的操作。

d <- merge(anna1, anna2, by=c("name",  "from", "to"), all=TRUE)
d$result <- ifelse(d$result.x == 0 & !is.na( d$result.y ), d$result.y, d$result.x)
d <- d[,c("name", "from", "to", "result")]