我有问题......
我有两个数据框
>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中的正确行中
提前谢谢
祝你好运 安娜
答案 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")]