繁体   English   中英

合并来自不同数据框的列

[英]Merging columns from different data frames

我有个问题....

我有两个数据框

>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的正确行中

先感谢您

最好的问候安娜

一个更简单的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

如果保证“发件人”列在anna1和anna2中都是唯一的,并且anna2中的每一行在anna1中都有匹配的行(尽管反之亦然),则一种简单的解决方案是

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

另一种方法

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']

您可以使用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")]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM