2016-11-23 157 views
2

我很努力在自己的函數中使用dplyr函數。我更接近理解,但仍然缺乏充分理解。 這裏我有df包含typeD10變量。使用dplyr創建一個具有多個參數的函數

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

我想寫一個新列會如果type == "KL"返回M的功能; "-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") 

,只有Ktyp列返回,而我想獲得這樣的輸出:

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 
+1

https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html – Haboryme

+0

鏈接不工作,反正我想我讀它,並完成了我提出的功能 – Mateusz1981

+1

你必須將'sortnr ='type''傳遞給你的函數,否則你的結果將永遠是'K' – wici

回答

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

你你能地圖嗚嗚嗚如下:

library(dplyr) 
library(purrr) 

定義一個函數來檢查條件:

​​

然後用圖如下,這需要從各行輸入,將它傳遞給將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" 
+0

這不是我想要的,我不想在一個函數內部進行更改,只要我運行它。我寧願想要改變函數的參數 – Mateusz1981

+0

啊哈,原則上你可以在編輯的解決方案中傳遞你想要的值。 – OmaymaS

相關問題