通过其他列的唯一值将列从一个数据框匹配到另一个数据框

时间:2016-06-15 22:03:50

标签: r loops mapping unique

我有两个数据框:

>old 
response    RT  sNumber blockNo
tiger       170       1       1
tornado     36        1       2
tiger       43        1       3
squire      34        2       1
tiger       48        2       2
tornado     49        2       3
tornado     45        3       1
mouse       66        3       2
tiger       75        3       3

>new
response    sNumber blockNo
tiger             1       1
tornado           1       2
squire            2       1
tiger             2       2
tornado           3       1
mouse             3       2
tiger             3       3

中,原始数量会减少。我想从复制 RT 列,并通过响应列执行映射到,方法是保持正确的值 RT 对应于唯一的 sNumber blockNo 。它应该是这样的:

>new2
response    RT  sNumber blockNo
tiger      170        1       1
tornado     36        1       2
squire      34        2       1
tiger       48        2       2
tornado     45        3       1
mouse       66        3       2
tiger       75        3       3

通常对于映射我使用这个循环:

for(wrd in unique(old$response)){
    new$RT[new$response == wrd] <- old$RT[old$response == wrd]
    }

但是,在这种特殊情况下,它会混乱所有RT值,因为它会连续累加它们而不检查唯一的 blockNo sNumber 。我应该如何以我描述的方式执行 RT 的映射?

1 个答案:

答案 0 :(得分:3)

要匹配两个data.frames中多个列中的值,并将其中的额外数据添加到另一个,您可以使用$objRest = new Rest('/myurl_base'); $objRest->post('/*/**', function($resource, $arrSubResources) { $resource::post_method($arrSubResources, $_POST); });

merge

这将检查 merge(old, new, by = c("response", "sNumber", "blockNo"), all = FALSE) response sNumber blockNo RT 1 mouse 3 2 66 2 squire 2 1 34 3 tiger 1 1 170 4 tiger 2 2 48 5 tiger 3 3 75 6 tornado 1 2 36 7 tornado 3 1 45 参数中指定的所有命名列中的值是否在data.frames之间匹配。当它们全部匹配时,data.frame中的其他列将添加到合并的数据中。

by=参数控制结果数据是否应仅包含两个data.frames之间所选列中匹配的行(默认值)。如果all = FALSE,合并的data.frame将包含data.frames中存在的所有行。