2

dplyr独自の関数で関数を使用するのに苦労しています。理解に近づいていますが、まだ完全には理解できていません。ここには、df変数typeD10変数があります。

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

;Mの場合に新しい列で返される関数を書きたいと思います。ifとそれは他のすべての場合に返されます。関数の開始時に の値を変更できるようにしたい。type == "KL""-1"type %in% c(9999, -1)K9999, -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
4

2 に答える 2

-1

次のようにpurrrからマッピングできます。

library(dplyr)
library(purrr)

条件をチェックする関数を定義します。

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

次に、次のようにマップを使用します。これは各行から型を取得し、それを 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"
于 2016-11-23T08:10:43.600 に答える