Mutate:一次分配多个变量

时间:2021-06-05 11:31:45

标签: r tidyverse mutate

我有一个如下所示的函数(简化)

private WavAudio wavMixing(WavAudio wav1, WavAudio wav2, double alpha) {
    WavAudio wav = new WavAudio();
    // perform the mixing as specified in the assignment and stored the mixed audio in wav
    // requirements:
    //  a) wav's duration should be same as wav1.
    //  b) if wav2 is shorter than wav1, then repeatedly use wav2 in a periodic manner

    // your code goes here
    // ***Create three byte[] to store data, wav1 data1, wav2 data2, wav data3***
    byte data1[] =  wav1.getData();
    byte data2[] =  wav2.getData();
    byte[] data3 = new byte[data1.length];

    /// ***Add the sum data of wav1 and wav2 to wav***
    for (int i=0; i<(data1.length+data2.length)/4; i++) {
        short buf1A = data1[i+1];
        short buf2A = data1[i];
        buf1A = (short) ((buf1A & 0xff) << 8);
        buf2A = (short) (buf2A & 0xff);

        short buf1B = data2[i+1];
        short buf2B = data2[i];
        buf1B = (short) ((buf1B & 0xff) << 8);
        buf2B = (short) (buf2B & 0xff);

        short buf1C = (short) (buf1A + buf1B);
        short buf2C = (short) (buf2A + buf2B);

        short res = (short) (buf1C + buf2C);

        data3[i] = (byte) res;
        data3[i+1] = (byte) (res >> 8);
    }

    // ***set wav data***
    wav.setData(data3);
    // ***?(?) = ??1(?) + (1 − ?)?2(?) Make wav1 and wav2 have different volume levels***
    double rate = alpha*wav1.getRate() + (1-alpha)*wav2.getRate();
    // ***set new wav***
    wav.set((int) rate,wav1.getNumChannels(),wav1.getBitPerSample(),wav1.getNumSamples(),wav.getData());
    // ***wav duration = wav1 duration***
    wav.duration = wav1.getDuration();

    return wav;
}

它返回两列!

现在,我想调用该函数并将其值分配给现有 tibble 的两个变量。我正在寻找类似的东西

get_identifiers<-function(shares){
  result<-c()
  for(share in shares){
    
    result<-rbind(result,c("2", "2"))
  }
  return (result)
}

我怎样才能做到这一点?

我知道我可以执行以下似乎效率不高的操作

res %>% mutate(vars(c("identifier","sedol")),get_identifiers(symbol))

1 个答案:

答案 0 :(得分:0)

您可以对功能进行一些更改 -

get_identifiers<-function(shares){
  result<-c()
  for(share in shares){
    result<- rbind(result,c("2", "2"))
  }
  result <- data.frame(result)
  names(result) <- c("identifier","sedol")
  return (result)
}

(有更好的方法来编写上述代码,但我明白这只是一个简化的例子。)

然后将输出保存在列表中并使用 unnest_wider 将它们放在不同的列中。

library(dplyr)
library(tidyr)

res %>% 
  mutate(data = list(get_identifiers(symbol))) %>%
  unnest_wider(data)
相关问题