2017-11-14 12 views
2

Table1 $ subjectには、変数 "Biology"、 "Chemistry"、および "Physics"が含まれています。 表2では、生物学/化学のすべてのインスタンスを1で置き換え、Physicsのすべてのインスタンスを0で置き換えたいと考えています。recodeとcase_whenを一緒に使用する

私はこれがrecodeとcase_whenコマンド:

Table2 <- recode(Table1, case_when(
    .$subject <= "biology" ~ 1, 
    .$subject <= "chemistry" ~ 1, 
    .$subject <= "physics" ~ 0)) 

現在、「case_whenは論理的ではなく、両面式でなければならない」というエラーメッセージが表示されます。私はRに新しいので、私は何が間違っているのかよく分かりません。誰にでもアイデアがあれば本当に感謝しています!

答えて

1

recodecase_whenは両方ともデータフレームではなくベクトルで動作します。したがって、新しいデータフレームを作成するには、最初にmutateを呼び出してからmutateの範囲内でrecodeまたはcase_whenのいずれかを使用して新しい列を作成(または既存のものを上書き)する必要があります。

(また、最新のdplyrリリースのとしてあなたは、もはやcase_whenを使用しているとき.$を使用する必要があります)


library(tibble) 
library(dplyr) 

df <- tribble(
    ~subject, 
    "chemistry", 
    "biology", 
    "physics" 
) 

df %>% 
    mutate(subject2 = case_when(
    subject == "chemistry" ~ 1, 
    subject == "biology" ~ 1, 
    subject == "physics" ~ 2, 
)) 

#> # A tibble: 3 x 2 
#>  subject subject2 
#>  <chr> <dbl> 
#> 1 chemistry  1 
#> 2 biology  1 
#> 3 physics  2 

df %>% 
    mutate(subject2 = recode(
    subject, 
    "chemistry" = 1, 
    "biology" = 1, 
    "physics" = 2, 
)) 

#> # A tibble: 3 x 2 
#>  subject subject2 
#>  <chr> <dbl> 
#> 1 chemistry  1 
#> 2 biology  1 
#> 3 physics  2 
1

これは私が最初にRで仕事を始めたときのことを思い出し、私は歩き、データ科学者にこれと全く同じ質問をしました。

彼らは私にこのような状況で一般的に好ましい別のアプローチを共有しました。私は何度も振り返り、早い段階でそれを学んでいることに感謝しています。

データベースの正規化アプローチ(そこに誰かがより良い名前を付け加えることができない限り)は、コード値を別のデータフレームにマッピングする必要があります。次に、マッピングされた値のコレクションを取り、エンコードするデータフレームにjoinを取り込みます。

これは操作、およびデータフレーム値/データを保持する責任を担当し、より厳密にコードを保つことができます。これは作業の多くをスピードアップするだけでなく、ハードコード化されたルックアップテーブルで手作業でコードを保存することもできますが、長期的には、デバッグや修正や再開発を行っているときにはずっと簡単になります。あなた自身が特に長いコードマップ(またはを構築するために迅速かつ簡単な方法を必要と判明した場合は、それらを共有

# your code mapping 
df_map <- tribble(~subject, ~subj_cd, 
        "chemistry", 1, 
        "biology", 1, 
        "physics", 0) 

# a dummy raw dataframe that you might be wanting to encode 
df_raw <- tibble(stud_id = 2678:2877, 
       subject = sample(c("chemistry", 
            "biology", 
            "physics", 
            "astronomy"), 200, replace = TRUE)) 

# encoding the data 
df_coded <- 
    df_raw %>% 
    left_join(df_map) 
df_code 
> df_coded 
# A tibble: 200 x 3 
    stud_id subject subj_cd 
    <int>  <chr> <dbl> 
1 2678 physics  2 
2 2679 physics  2 
3 2680 biology  1 
4 2681 astronomy  NA 
5 2682 chemistry  1 
6 2683 chemistry  1 
7 2684 physics  2 
8 2685 chemistry  1 
9 2686 chemistry  1 
10 2687 astronomy  NA 
# ... with 190 more rows 

正規化されたデータ管理のアプローチは、次のようになります他の人と一緒に)、あなたはおそらくジェニーブライアンのgooglesheetsパッケージ(彼女はチームのメンバーtidyverseのメンバーです)A本当にhelpful vignette for it can be found here

関連する問題