【问题标题】:Merging columns from different data frames合并来自不同数据框的列
【发布时间】:2012-02-04 05:39:16
【问题描述】:

我有问题....

我有两个数据框

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

提前谢谢你

最好的问候 安娜

【问题讨论】:

    标签: r join merge dataframe


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 在 anna2 数据框中, from 和 to 列中的值与 anna2 中的值相同。问题是,在 anna2 中的值是 anna1 的子集,所以.....我只需要在正确行中的 anna1 的结果中匹配并替换 0 为 anna2 的结果
      • 您的意思是“与 anna1 中的值相同”吗?而且我认为你可能误解了我的意思。但是“唯一”,我的意思是你永远不会有相同的值在 anna1 中出现两次的情况。
      • 你试过我的解决方案了吗?从你说的情况来看,我认为它应该有效。如果它不起作用,请具体说明它是如何不起作用的。
      • @DavidRobinson 你能帮我解决这个问题吗:[stackoverflow.com/questions/35484595/…
      【解决方案3】:

      另一种方法

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        猜你喜欢
        • 2019-06-09
        • 1970-01-01
        • 2016-10-29
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多