dplyr可以避免使用多个合并吗?

时间:2016-06-29 21:01:30

标签: r merge dplyr

我有数据框" d"下面有2列PCT1和PCT2。我想为每组绘制加权的PCT1和PCT2。这要求:

(1)计算每组的加权pct1和加权pct2。目前我正在使用dplyr进行两次调用 (2)然后我将2个结果与rbind()

合并

有没有办法避免两次调用dplyr并仍然产生"结果"数据框架?实际上我有10列不是2,我必须调用dplyr 10次,并执行以下操作:

    initAudioPlayer();

    function initAudioPlayer(){
      var audio = new Audio();
      var aContainer = document.getElementById('listenlagu');
      // assign the audio src
      audio.src = aContainer.querySelectorAll('source')[0].getAttribute('src');
      audio.load();
      audio.loop = true;
      audio.play();

      // Set object references
      var playbtn = document.getElementById("play_btn");

        // Add Event Handling
        playbtn.addEventListener("click", playPause(audio, playbtn));
      }

      // Functions
      function playPause(audio, playbtn){
          return function () {
             if(audio.paused){
               audio.play();
               playbtn.style.background = "url(images/pause70.png) no-repeat";
             } else {
               audio.pause();
               playbtn.style.background = "url(images/play70.png) no-repeat";
             } 
          }
      }

谢谢。

 rbind(PCT1,PCT2,PCT3,PCT4, PCT5, ....,PCT10)

结果

   d= data.frame (group =c("A","A","B","B"),
            PCT1 = c(100,50,100,50),
            PCT2 = c(50,1,10,5),
            weight = c(99,1, 100,100))
d

  group PCT1 PCT2 weight
1     A  100   50     99
2     A   50    1      1
3     B  100   10    100
4     B   50    5    100

PCT1  = d %>% group_by(group)  %>%  summarise(vmean =  weighted.mean(PCT1, weight))
PCT1$PCT =1
PCT2  = d %>% group_by(group)  %>%  summarise(vmean =  weighted.mean(PCT2, weight))
PCT2$PCT =2
result = rbind(PCT1, PCT2)

2 个答案:

答案 0 :(得分:3)

您只需要进一步融化数据框:

library(dplyr)
library(tidyr)

d <- data.frame (group =c("A","A","B","B"),
                             PCT1 = c(100,50,100,50),
                             PCT2 = c(50,1,10,5),
                             weight = c(99,1, 100,100))

d %>%
    gather(key = PCT_GRP,value = PCT,PCT1:PCT2) %>%
    group_by(group,PCT_GRP) %>%
    summarise(vmean = weighted.mean(PCT,weight))

答案 1 :(得分:1)

另一个选项是data.table

library(data.table)
melt(setDT(d), measure = c("PCT1", "PCT2"), variable.name = "PCT_GRP")[,
        .(vmean = weighted.mean(value, weight)) , .(group, PCT_GRP)]
#   group PCT_GRP vmean
#1:     A    PCT1 99.50
#2:     B    PCT1 75.00
#3:     A    PCT2 49.51
#4:     B    PCT2  7.50