2017-12-05 14 views
1

더 쉬운 방법으로 벡터를 코드화하고 싶습니다. 특히 벡터를 dplyrrecode과 같은 함수에 전달하는 방법이 있는지 궁금합니다. 나는 준 준법의 기초를 이해하지만, =을 통합하는 방법을 알지 못한다.Dpylr의 recode 함수는 1 대 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" 
       ) 

을하고 싶습니다 두 벡터를 전달하고 모든 변수 이름을 바꿀 수있는 방법을 찾아 냈습니다.

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")