【问题标题】:Summarize two columns given unique combinations总结给定唯一组合的两列
【发布时间】:2014-02-16 11:29:51
【问题描述】:

提前致谢。我有一个旅行数据框,表示开始位置、结束位置和每个位置之间的距离组合。像这样:

Start = c("Johns House", "Mikes House", "Franks House")
Finish = c("Mikes House", "Johns House", "Lisas House")
Distance = c(1000,1000,500) 
myDF = data.frame(Start, Finish, Distance)

我想返回一个处理 John/Mike 两次旅行的新数据框,但将它们视为一个独特的组合。具体来说,我想返回每个组合的总行程次数和位置之间的距离 - 所以输出将是:

newStart = c("Johns House", "Franks House")
newFinish = c("Mikes House", "Lisas House")
newDistance = c(1000,500)
Count = c(2,1)
newDF = data.frame(newStart, newFinish, newDistance, Count)

再次感谢。

【问题讨论】:

    标签: r


    【解决方案1】:

    我认为使用 SQL 会更容易。在 R 中安装 SQL 包,例如“sqldf”。

    首先你可以计算每个元组有多少次开始 - 以任何一种方式结束:

    library(sqldf)
    
    sqldf("select distinct 
          min(a.Start, a.Finish) Start, 
          max(a.Start, a.Finish) Finish, 
          a.Distance, 
          count(*) Count
          from myDF a, myDF b
          where (a.Start = b.Start and  a.Finish = b.Finish)
          or (a.Start = b.Finish and a.Finish = b.Start)
          group by a.Start")
    
    #          Start      Finish Distance Count
    # 1 Franks House Lisas House      500     1
    # 2  Johns House Mikes House     1000     2
    

    【讨论】:

      【解决方案2】:
      library(data.table)
      myDT <- data.table(myDF)
      x <- paste(myDT$Start, myDT$Finish, sep = "|")
      myDT$v <- vapply(x, function(xi) paste(sort(strsplit(xi, "[|]")[[1]]), collapse=''), '')
      myDT[, Count := length(Distance), by = v]
      myDT <- myDT[!duplicated(v), ]
      myDT
      
      #          Start      Finish Distance           v Count
      #1:  Johns House Mikes House     1000  JohnsMikes     2
      #2: Franks House Lisas House      500 FranksLisas     1
      

      我使用@Tommy 的答案How to sort letters in a string? 对字符串进行排序。

      【讨论】:

      • 字符串是否像示例中那样使用“XYZ House”?因为我是根据这个来分裂的。我已经更新了我的答案,以便更清楚地了解发生了什么。
      • 我刚刚在示例上运行了您的代码,myDF 保持不变。
      • 感谢马特...感谢您的帮助 - 但仍然没有运气
      • 第三次魅力?没有注意到您想要计数,而我在原始答案中省略了将字符串粘贴在一起。
      • Matt- 谢谢,这真的很酷。感谢您回答这个问题,但我很好奇是否可以对其进行修改,以便对所使用的实际字符串没有要求。比如说,不是“House”而是“Bus Stop”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多