2016年8月22日 星期一

矩陣的條件式篩選

Problem:


在R的資料處理環境中,有時須先篩選符合條件的資料,再進行後續處理,以下說明如何完成此需求.

感謝R友-Mimi 提供此問題.

Analysis:
























本問題是如何找出同時滿足數值大於或等於0.5, 較辛苦的方法是將所有條件用 AND 運算(&)找出其結果. 實務上可考慮邏輯運算特性, 即 TRUE 表示1, FALSE 表示0, 利用 sum( )函數計算加總為12表示該列所有行滿足條件. 因為是每列都要判斷, 因此採用 apply, 第2個參數設定為1表示列運算. 最後以 which 回傳符合條件之指標.











# R code
# 建立矩陣範例 318*12
set.seed(123)
m <- matrix(round(c(runif(318*7), rep(1, 318*5)), 2), ncol=12)
rownames(m) <- paste0("row", 1:318)
head(m)

# 條件篩選
m.check <- (m >= 0.5)
head(m.check)

# 如果整列加總=12,表示所該列所有資料行皆符合篩選條件
ind <- which(apply(m.check, 1, sum) == 12)
ind
m[ind, ]
# end

2 則留言:

  1. 這個例子實在受用!老師太厲害了!!!
    如果是用在shiny套件上,可以讓使用者自行勾選1~12欄位,
    只要選的欄位符合條件即可,不需要每一欄位都符合的話,
    此時的邏輯要怎麼變化呢?
    (現在頭腦裡的邏輯還是卡在每選一個欄位,就需要多一個&的想法,沒有靈活運用到邏輯思維>"< alan9956)

    回覆刪除
    回覆
    1. Hi friend,

      步驟1 先使用 checkboxGroupInput() 依照欄位名稱建立複選題
      步驟2 依上述選取結果使用 which() 篩選結果, 有問題歡迎再討論.

      刪除