2017-07-25 11 views
2

問題:ifelseステートメントの数に制限があることを知るために、100個以上のifelseステートメントで巨大なコードを書いています.50を超えるとエラーがスローされます。とにかく、私がやろうとしていることをやるためのより効率的な方法があることを知っています。ifelseステートメントで制限を超過

目的:文字列のさまざまなバリエーション(以下の例を参照)を明確なカテゴリ(例:下記)にコード化する機能を記述しようとしています。私はstr_detectを使用してT/Fを与え、応答に基づいて正しいカテゴリに変更します。どのように私は100以上ifelseステートメント(これ以上のカテゴリがある)なしでこれを行うことができます。

例:あなたは、名前のベクトルであなたのパターンを置くことができる

mydf <- data_frame(answer = sample(1:5, 10, replace = T), 
       location = c("at home", "home", "in a home", 
"school", "my school", "School", "Work", "work", 
         "working", "work usually")) 

loc_function <- function(x) { 
    home <- "home" 
    school <- "school" 
    work <- "work" 
    ifelse(str_detect(x, regex(home, ignore_case = T)), "At Home", 
    ifelse(str_detect(x, regex(school, ignore_case = T)), "At 
School", 
      ifelse(str_detect(x, regex(work, ignore_case = T)), "At 
Work", x))) 
} 

### Using function to clean up messy strings (and recode first column too) into clean categories 
mycleandf <- mydf %>% 
    as_data_frame() %>% 
    mutate(answer = ifelse(answer >= 2, 1, 0)) %>% 
    mutate(location = loc_function(location)) %>% 
    select(answer, location) 

mycleandf 

# A tibble: 10 x 2 
    answer location 
    <dbl>  <chr> 
1  1 At Home 
2  1 At Home 
3  1 At Home 
4  1 At School 
5  1 At School 
6  1 At School 
7  1 At Work 
8  0 At Work 
9  1 At Work 
10  0 At Work 
+4

をあなた自身が何かのほんの一握り以上のものを必要とする見つけたら* https://www.tutorialspoint.com/r/r_switch_statement.htm – Kai

+2

* ifelse 100以上の文を使用して、あなたは考え始める必要がありますより良い方法を見つけることについて。あなたが2匹の一握りに達すると、あなたは何かが間違っていると思うようになるはずです。あなたが手押し車をいっぱい持っている点に達すると、あなたは完全に骨抜きにして助けを求める必要があることを**知っている**。 dumptruckレベルに達しました。 –

+0

case_when文を使用するか、または関数をすべての単語にマッピングして大文字小文字にするために、purr:map()を使用するといいでしょうか? – petergensler

答えて

3

Other = ""に気づくが、これは秋に戻ってあなたのパターンのどれも文字列に一致していないときである):

patterns <- c("At Home" = "home", "At School" = "school", "At Work" = "work", "Other" = "") 

パターンをループして、文字列にパターンが含まれているかどうかを確認します。

match <- sapply(patterns, grepl, mydf$location, ignore.case = T) 

フィン味方戻っ他にフォール、あなたは何も一致しない場合は、と交換したいものであるマッチしたパターンの名前をチェック買う新しい列を構築する:

mydf$clean_loc <- colnames(match)[max.col(match, ties.method = "first")] 
mydf 

# A tibble: 10 x 3 
# answer  location clean_loc 
# <int>  <chr>  <chr> 
# 1  3  at home At Home 
# 2  3   home At Home 
# 3  3 in a home At Home 
# 4  3  school At School 
# 5  2 my school At School 
# 6  4  School At School 
# 7  5   Work At Work 
# 8  1   work At Work 
# 9  2  working At Work 
#10  1 work usually At Work 
+0

非常に役に立ちます。両方に一致する文字列があれば、どうすればそれを正しく並べ替えることができますか? EG:「自宅で働いている」「私は仕事中」と分類したいパターンまたは一致する論理シーケンスを調整しますか? –

+0

パターンの順序を調整し、優先順位を付けるパターンを配置しないでください。だから、At​​ At Homeの前にAt Atを置くと、At At Workを得ることができます。 – Psidom

0

のではなく、あなたが順番に実行することができる条件をネスト。 forループの使用:

# Store the find-replace pairs in a data frame 

word_map <- data.frame(pattern = c("home", "school", "work"), 
         replacement = c("At Home", "At School", "At Work"), 
         stringsAsFactors = FALSE) 

word_map 
pattern replacement 
1 home  At Home 
2 school At School 
3 work  At Work 

# Iterate through the pairs 

for (i in 1:nrow(word_map)) { 

    pattern  <- word_map$pattern[i] 
    replacement <- word_map$replacement[i] 

    mydf$location <- ifelse(grepl(pattern, mydf$location, ignore.case = TRUE), replacement, mydf$location) 
} 

mydf 
    answer location 
1  4 At Home 
2  4 At Home 
3  1 At Home 
4  5 At School 
5  1 At School 
6  2 At School 
7  5 At Work 
8  2 At Work 
9  1 At Work 
10  3 At Work 
関連する問題