2017-12-05 6 views
1

私はベクトルを簡単にコード化することを望みます。具体的には、ベクトルをdplyrrecodeのような関数に渡す方法があるのだろうかと思います。私は準分数の基礎を理解していますが、=をどのように組み込むのかが分かりません。Dpylrのrecode関数は多対1 R

library(tidyverse) 

vec1 <- rep(LETTERS[1:7],7) 

#standard way 
vec2 <- recode(vec1, 
       "A" = "Value1", 
       "B" = "Value2", 
       "C" = "Value3", 
       "D" = "Value4", 
       "E" = "Value5", 
       "F" = "Value6", 
       "G" = "Value7" 
       ) 

vec3 <- recode(vec1, 
       "A" = "Value1", 
       "B" = "Value1", 
       "C" = "Value2", 
       "D" = "Value2", 
       .default = "Value other" 
       ) 

私は解決策を持っているだけでなく、...=

do.call(dplyr::recode, 
     c(list(vec1), 
     setNames(rep("Value1",length(val1)), val1), 
     setNames(rep("Value2",length(val2)), val2))) 

私は機能を組み込む方法を見つけ出すことはできません、次の

vec3 <- some.function(vec1, 
       c("A", "B") = "Value1", 
       c("C", "D") = "Value2", 
       .default = "Value other" 
       ) 

をやってみたいです2つのベクトルを渡してすべての変数の名前を変更する方法を見つけました。

recode.by.vectors <- function(x, current.names, new.names){ 
    do.call(dplyr::recode, c(list(x), setNames(new.names, current.names))) 
} 

最後に、私は基本的な解決策を知っています。

vec3 <- vec1 
val1 <- c("A", "B") 
val2 <- c("C", "D") 
vec3[vec1 %in% val1] <- "Value1" 
vec3[vec1 %in% val2] <- "Value2" 
vec3[!vec1 %in% c(val1,val1)] <- "Value other" 

ここで実行された割り当てをどのように関数に組み込むかはわかりません。

答えて

3

dplyrパッケージのcase_whenを使用できます。

library(dplyr) 

vec1 <- rep(LETTERS[1:7],7) 

vec2 <- case_when(
    vec1 %in% c("A", "B") ~ "Value1", 
    vec1 %in% c("C", "D") ~ "Value2", 
    TRUE      ~ "Value other" 
) 
head(vec2) 
# [1] "Value1"  "Value1"  "Value2"  "Value2"  "Value other" "Value other" 
2

(もtidyverseパッケージに含まれています)forcatsパッケージ

library(forcats) 

vec1 <- rep(LETTERS[1:7], 7) 

fct_collapse(vec1, 
      Value1 = c("A", "B"), 
      Value2 = c("C", "D"), 
      `Value other` = c("E", "F", "G")) 

あなたはValue otherに入れるためにカテゴリがたくさんある場合、これは少し面倒ですが、二次のステップで、あなたができるの使い方少し簡略化する

fct_collapse(vec1, 
      Value1 = c("A", "B"), 
      Value2 = c("C", "D")) %>% 
    fct_other(keep = c("Value1", "Value2"), 
      other_level = "Value other")