Re: [問題] 想用R篩選出每一欄都有值的筆數

看板R_Language作者 (天)時間8年前 (2017/01/06 15:15), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《menghsuanliu (庫庫少)》之銘言: : [問題類型] : 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R) : [軟體熟悉度]: : 入門(寫過其他程式,只是對語法不熟悉) : [問題敘述]: : 我有一個data frame 有160筆資料,有100個欄位,有些有值,有些值是0(這些值都是數 : 字型熊) : 我想找出那些100個欄位都有值(>0)的筆數,我想對這些都有值的筆數進行其他的分析 : 請問有什么方式可以快速挑出符合我需求的資料? : [程式範例]: : [環境敘述]: : [關鍵字]: data.table的作法滿tricky的,看你要不要學 我是覺得apply效率沒差太多之下,兩個隨便用都可以 library(data.table) library(pipeR) # data generation numRows <- 1e5L DT <- data.table( matrix(rnorm(numRows * 100), numRows), matrix(sample(LETTERS, numRows * 10, TRUE), numRows) ) %>>% setnames(paste0("V", 1L:110L)) for (i in 1L:100L) { locNA <- sample(nrow(DT), 100L) set(DT, locNA, i, NA) locZero <- sample(which(!is.na(DT[[i]])), 100L) set(DT, locZero, i, NA) } # check DT[ , lapply(.SD, function(x) sum(is.na(x) | x == 0)), .SDcols = V1:V100] # V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 ... # 1: 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 ... # method 1 system.time({ numericColNames <- colnames(DT)[which(sapply(DT, is.numeric))] expr <- paste0(paste0(paste0("is.na(", numericColNames, ")"), collapse = "|"), "|", paste0(paste0(numericColNames, "==0"), collapse = "|")) DT2 <- DT[ , removeCol := eval(parse(text = expr))] %>>% `[`(removeCol == FALSE) %>>% `[`(j = removeCol := NULL) }) # user system elapsed # 0.12 0.03 0.15 # method 2 system.time({ numericColNames <- colnames(DT)[which(sapply(DT, is.numeric))] expr <- paste0(paste0(paste0(numericColNames, "==0"), collapse = "|")) DT2 <- DT[ , removeCol := eval(parse(text = expr))] %>>% na.omit %>>% `[`(removeCol == FALSE) %>>% `[`(j = removeCol := NULL) }) # user system elapsed # 0.16 0.09 0.14 # method 3 DT[ , removeCol := NULL] system.time({ removeIdx <- DT[ , numericColNames, with = FALSE] %>>% as.matrix %>>% apply(1, function(x) !is.na(all(x | x != 0))) DT3 <- DT[removeIdx, ] }) # user system elapsed # 0.67 0.03 0.70 all.equal(DT2, DT3) # TRUE -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.170.36.131 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1483686942.A.D86.html

01/06 16:09, , 1F
感謝,我再來試試
01/06 16:09, 1F
文章代碼(AID): #1ORqGUs6 (R_Language)
文章代碼(AID): #1ORqGUs6 (R_Language)