[英]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.