作者celestialgod (天)
看板R_Language
标题Re: [问题] 想用R筛选出每一栏都有值的笔数
时间Fri Jan 6 15:15:40 2017
※ 引述《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://webptt.com/cn.aspx?n=bbs/R_Language/M.1483686942.A.D86.html
1F:推 menghsuanliu: 感谢,我再来试试 01/06 16:09