将列表应用于输出数据帧的函数

时间:2016-10-27 01:42:10

标签: r list function dplyr tidyverse

我的单参数函数输出数据帧

public class MysteryHandler {

    private static SecretKey secretKey;
    private static Cipher cipher;
    private static byte[] utf8Bytes;

    /**Verschluesseln*/
    public static byte[] encrypt(String plainText){
        try {
            secretKey = KeyGenerator.getInstance("AES").generateKey();
            cipher = Cipher.getInstance("AES/CBC/PKCS7PADDING");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            utf8Bytes = plainText.getBytes("UTF8");
            return cipher.doFinal(utf8Bytes);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**Entschluesseln*/
    public static String decrypt(byte[] secret){
        try {
            cipher = Cipher.getInstance("AES/CBC/PKCS7PADDING");
            cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(secret, secret.length - 16, 16));
            utf8Bytes = cipher.doFinal(secret);
            return new String(utf8Bytes, "UTF8");
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }

}

将单参数输入此函数时,它会按预期输出数据帧:

library(tidyverse) 
myfun <-function(x) {mtcars %>%
                         filter_(x) %>%
                         group_by(cyl) %>%
                         summarise(mean(disp), mean(drat)) %>%
                         mutate(group=x)}

如何将这样的函数应用于参数列表,以便输出是一个数据帧,组合列表中的所有结果。例如,我想将myfun应用于列表

   myfun('mpg>15')

   cyl      mean(disp)   mean(drat)     group
    4       105           4.07          mpg>15
    6       183           3.59          mpg>15
    8       105           3.20          mpg>15

,结果,获得单个数据帧:

c('mpg>15', 'drat>4.2')

如何做到这一点(最好是在tidyverse内)?

1 个答案:

答案 0 :(得分:3)

留在tidyverse,可能是这样的:

c("mpg>15", "am==1") %>% map(myfun) %>% bind_rows

但是,正如@alistaire在评论中指出的那样,你可以通过使用map_df来缩短它,它会返回一个数据框:

c("mpg>15", "am==1") %>% map_df(myfun)

混合选项,三种等效方式,使用lapply

lapply(c("mpg>15", "am==1"), myfun) %>% bind_rows 
c("mpg>15", "am==1") %>% lapply(myfun) %>% bind_rows
bind_rows(lapply(c("mpg>15", "am==1"), myfun))

或者,对于混合基数和整数反应有点不正常:

c("mpg>15", "am==1") %>% lapply(myfun) %>% do.call(rbind, .)

对于基础R传统主义者:

do.call(rbind, lapply(c("mpg>15", "am==1"), myfun))