Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 合并来自不同数据帧的列_R_Join_Merge_Dataframe - Fatal编程技术网

R 合并来自不同数据帧的列

R 合并来自不同数据帧的列,r,join,merge,dataframe,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 1

我有个问题

我有两个数据帧

>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中的result列中获取数字,并将它们放在anna1中的正确行中

先谢谢你

致意 Anna

如果保证“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

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

d更简单的
合并

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

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

在ANA2数据框中,from和to列中的值与ANA2中的值相同。问题是,在anna2中,值是anna1的子集,因此……我只需要将0与正确行中anna1结果中的anna2结果中的值进行匹配并替换。您的意思是“与anna1中的值相同”吗?我想你可能误解了我。但是“唯一”,我的意思是,你从来没有过相同的值在anna1中出现两次的情况。你尝试过我的解决方案吗?从你所说的,我认为它应该起作用。如果它不起作用,请具体说明它是如何起作用的。@DavidRobinson你能帮我回答这个问题吗:[你能帮我回答这个问题吗:[
require(plyr)
anna <- rbind(anna1, anna2)
ddply(anna, .(name, from, to), summarize, result = sum(result))
require(data.table)
data.table(anna)[,list(result = sum(result)),'name, from, to']