使用dplyr创建具有多个参数的函数

时间:2016-11-23 07:24:40

标签: r dplyr nse

我正在努力在自己的函数中使用dplyr函数。我更接近理解,但仍然缺乏充分的理解。 在这里,我df包含typeD10个变量。

df <- data.frame(type = c("KL", "KL", "A", "A", "B", "B", "9999", "-1"), 
                 D10 = rnorm(8, 3, 4))

我想编写一个函数,如果M,新列中的函数将返回type == "KL";如果"-1" type %in% c(9999, -1),则K将返回9999, -1, KL所有其他案例。我希望在启动函数时可以更改klme <- function(dat, met, minusy = c(-1, 9999), Sortnr, type){ mutate_call <- lazyeval::interp(~ifelse(a %in% met, "M", ifelse(a %in% minusy, "-1", "K")), a = as.name(Sortnr)) dat %>% mutate_(.dots = setNames(list(mutate_call), type)) } klme(df, c("KL"), minusy = c(-1, 9999), "Sortnr", "typ") 的值。

我尝试使用看起来像这样的函数结束:

K

只返回typ列中的 type D10 type.1 1 KL -5.3210620 M 2 KL 4.4832414 M 3 A -5.3979886 K 4 A 2.7933964 K 5 B -0.9602293 K 6 B 4.5097305 K 7 9999 -3.9650796 -1 8 -1 5.2700609 -1 ,而我想获得这样的输出:

 public void saveEmployeeDetails(Employee employeeDetails){

   try{
       System.out.println("----saveEmployeeDetails----");          

       getSession().saveOrUpdate(employeeDetails);

       }
       catch (Exception e) {               
           e.printStackTrace();           
    }
}

2 个答案:

答案 0 :(得分:3)

我相信您正在寻找这一点,请记住您需要interp所有可变的值(同样@wici是对的,因为您对klme的调用不应该Sortnr这不是df}中的列:

df <- data.frame(type = c("KL", "KL", "A", "A", "B", "B", "9999", "-1"), 
                 D10 = rnorm(8, 3, 4))

klme <- function(dat, met, minusy = c(-1, 9999), Sortnr, type){
  mutate_call <- lazyeval::interp(~ifelse(a %in% y, "M", 
                                          ifelse(a %in% z, "-1", "K")),
                                  a = as.name(Sortnr),
                                  y = met,
                                  z = minusy)
  dat %>% mutate_(.dots = setNames(list(mutate_call), type))
}

klme(df, c("KL"), minusy = c('-1', '9999'), "type", "typ")
  type        D10 typ
1   KL  6.4760905   M
2   KL  7.5196368   M
3    A  2.2588101   K
4    A  1.4910878   K
5    B -0.3357310   K
6    B  1.9693856   K
7 9999 -0.3820483  -1
8   -1  4.5595150  -1

答案 1 :(得分:-1)

您可以 purrr 映射,如下所示:

library(dplyr)
library(purrr)

定义一个检查条件的函数:

GetType <- function(x)
{
      if(x=="KL")  "M"
        else if(x %in% c(9999,-1) ) "-1"
        else "K"
}

然后使用map,如下所示,这将从每一行获取类型,将其传递给GetType函数并返回新列中的值:

df <- df %>% 
        mutate(type.1=map_chr(type,GetType))

> df
  type        D10 type.1
1   KL  3.0820944      M
2   KL  8.0126703      M
3    A  8.0629672      K
4    A  5.8460856      K
5    B  0.6803590      K
6    B -1.1148491      K
7 9999 -0.4981576     -1
8   -1  1.0648742     -1

修改 原则上,您还可以将要比较的值传递给函数:

val <- list("KL",c(9999,1))

GetType <- function(x,y)

{
         if(x==y[[1]])  "M"
        else if(x %in% y[[2]] ) "-1"
        else "K"
}


> GetType(df$type[1],val)
[1] "M"