2012-01-06 121 views
2

我有一个问题....从不同的数据合并列帧

我有两个数据帧

>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

预先感谢您

问候 安娜

回答

1

如果“从”列保证在anna1和anna2中都是独一无二的,永远不变在anna2Ÿ行在anna1匹配的行(虽然不是反之亦然),一个简单的解决方案是

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

在anna2数据帧中的值的列从和到与在anna2的valuse相同。问题是,在anna2中,这些值是anna1的一个子集,所以......我只需要将anna1的结果中的值与anna2的结果中的值进行匹配并将其替换为正确的行中的anna1的结果 – Anna 2012-01-06 14:22:18

+0

您的意思是“与anna1中的值相同”?我想你可能会误解我。但“独一无二”,我的意思是你永远不会有在anna1中出现两次相同值的情况。 – 2012-01-06 14:24:23

+0

你试过我的解决方案吗?从你说的话,我认为它应该工作。如果它不起作用,请具体说明它不如何。 – 2012-01-06 14:25:06

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")] 
+0

你能帮我解决这个问题吗:[http://stackoverflow.com/questions/35484595/data-frame-merge-and-selection-of-values-which-are-common-in-2-data -frames] – user3253470 2016-02-18 16:11:37

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

另一种方法

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

编辑。如果数据帧是大的,并且速度是一个问题,考虑使用data.table

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