使用 dplyr 创建具有多个参数的函数
Creating a function with multiple arguments using dplyr
我正在为在自己的函数中使用 dplyr
函数而苦苦挣扎。我更接近于理解,但仍然缺乏完全的理解。
这里我有 df
包含 type
和 D10
变量。
df <- data.frame(type = c("KL", "KL", "A", "A", "B", "B", "9999", "-1"),
D10 = rnorm(8, 3, 4))
我想编写一个函数,如果type == "KL"
; "-1"
如果 type %in% c(9999, -1)
并且对于所有其他情况将 return 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")
return 只有 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
你可以从 purrr map 如下:
library(dplyr)
library(purrr)
定义一个函数来检查您的条件:
GetType <- function(x)
{
if(x=="KL") "M"
else if(x %in% c(9999,-1) ) "-1"
else "K"
}
然后按如下方式使用 map,这从每一行获取类型,将其传递给 GetType 函数和 return 新列中的值:
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"
我相信你正在寻找这个,记住你需要 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
我正在为在自己的函数中使用 dplyr
函数而苦苦挣扎。我更接近于理解,但仍然缺乏完全的理解。
这里我有 df
包含 type
和 D10
变量。
df <- data.frame(type = c("KL", "KL", "A", "A", "B", "B", "9999", "-1"),
D10 = rnorm(8, 3, 4))
我想编写一个函数,如果type == "KL"
; "-1"
如果 type %in% c(9999, -1)
并且对于所有其他情况将 return 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")
return 只有 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
你可以从 purrr map 如下:
library(dplyr)
library(purrr)
定义一个函数来检查您的条件:
GetType <- function(x)
{
if(x=="KL") "M"
else if(x %in% c(9999,-1) ) "-1"
else "K"
}
然后按如下方式使用 map,这从每一行获取类型,将其传递给 GetType 函数和 return 新列中的值:
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"
我相信你正在寻找这个,记住你需要 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