2017-10-04 78 views
1

可能是一個愚蠢的問題,我想用多個條件在一個tibble中重新編碼多個變量。在R中使用tidyverse重新編碼多個變量

數據例如:

library(tidyverse) 
s <- matrix(sample(1:15, 20, replace = TRUE), ncol = 4) 
s <- as_tibble(s) 

其中給出這樣的:等於

# A tibble: 5 x 4 
    V1 V2 V3 V4 
    <int> <int> <int> <int> 
1 11  2  5 14 
2  5  4 15  5 
3 13 15  2  5 
4  7 13 15 11 
5 11  5 12  3 

我要重新編碼V1,V2,V3與此條件,並留下V4: 如果該值小於或等於5得到1,如果該值大於5但小於或等於10得到2,最後如果該值大於10得到3.

輸出應該是lo確定這樣的:

# A tibble: 5 x 4 
     V1 V2 V3 V4 
     <int> <int> <int> <int> 
    1 3  1  1  14 
    2 1  1  3  5 
    3 3  3  1  5 
    4 2  3  3  11 
    5 3  1  3  3 

我知道申請,sapply,vapply,但我想利用tidyverse包並以優雅的方式功能重新編寫。

在此先感謝!

+0

看看'在dplyr mutate_at'。它旨在將相同的功能應用於多列,您可以選擇,但不管您喜歡。 – MrFlick

回答

5

要詳細說明@MrFlick評論,您可以將mutate_at與dplyr中的case_when函數結合使用。它應該是這樣的:

s %>% 
    mutate_at(vars(V1:V3), 
      function(x) case_when(x <= 5 ~ 1, x <= 10 ~ 2, TRUE ~ 3)) 

這會給你:

# A tibble: 5 x 4 
    V1 V2 V3 V4 
    <dbl> <dbl> <dbl> <int> 
1  3  1  3  6 
2  2  1  1  8 
3  2  3  1 14 
4  1  3  3 15 
5  1  2  3  7 
+0

儘管V4專欄中存在拼寫錯誤,但它起作用!感謝您向我介紹mutate_at函數! –

+1

錯在哪裏?你指的是不同的數字嗎?如果是這樣的話,那麼只要做到這一點,'sample'在爲我創建矩陣時使用了不同的數字,然後當您這樣做時。 – tbradley

+1

我剛剛意識到!它工作正常! –