赞
踩
1、求matrix或者dataframe的转置均是:t(A)
2、求一个vector的最后一个元素:tail(x,1)
3、将data(matrix或者dataframe或者vector)NA替换为0:data[is.na(data)] <- 0
4、计算程序运行时间:
方法一:
x <- rnorm(1000000)
system.time(density(x))
时间结果中:用户”是消耗在应用程序(非操作系统部分)执行的时间,“系统”是底层操作系统执行 (例如磁盘读写等)部分的时间,“流逝”是经过的总时间(可以认为是前两者的总和)。一般优化时主要关注“用户”的时间。
方法二:
timestart <- Sys.time()
main_function(criterions_file, data_file, result_file)
timeend <- Sys.time()
runningtime <- timeend-timestart
print(runningtime)
5、将list转化为dataframe的方法:
方法一:do.call与rbind联合使用,结果是list。(推荐)
result <- do.call(rbind, l)
方法二:用unlist拆分list后重构矩阵然后转换为data.frame
l <- replicate(
5,
list(sample(letters, 4)),
simplify = FALSE
)
lr <- data.frame(matrix(unlist(l), nrow=5, byrow=T),stringsAsFactors=FALSE)
方法三:lapply 函数和sapply函数
data.frame(matrix(lapply(l,as.character),nrow=5))
data.frame(matrix(t(sapply(l,c)),nrow=5))
6、发现R语言很神奇的一个地方,利用filter求滑窗均值时,n个1求均值结果虽然是1(看到的是1),但是这个结果只是近似等于1,其实均值介于0.999999999999999(15个9)与0.9999999999999999(16个9)之间。所以有时候会出现1<1的神奇现象。
result <- filter(y/5,rep(1,5),sides = 1)
其中,y为一个matrix,5表示窗口长度,side=1表示以当前时间为基准,向前数5个点。
这时,如果要让结果result(matrix或者dataframe)中小于1的数改为0,可以如下编写程序:
result[result < 0.999999999999999] <- 0
# 或者
result[which(result < 0.999999999999999)] <- 0
7、如何确定一个元素位于dataframe或者matrix中的哪一行哪一列?
#arr.ind=T can get row and column location
which(x == 1, arr.ind=T)
如何查看多个元素位于dataframe或者matrix中的哪一行哪一列?
set.seed(23)
mat <- matrix(sample(1:5,20,replace=TRUE),ncol=2)
mat
do.call('rbind',sapply(c(2,3,4),function(x) which(mat==x,arr.ind=T)))
8、一个字符串template中有形如“[XXXX]”的子串,提取[]中间的字符串如下:
rule = '\\[([^\\[\\]]+)\\]'
slotList = unlist(regmatches(template, gregexpr(rule, template, perl=T)))
字符串操作:
#将&&替换为&
criterions_groupe <- gsub("&&","&",criterions_groupe)
#将||替换为|,|在正则表达式中是特殊字符,需要加\\转义
criterions_groupe <- gsub("\\|\\|","\\|",criterions_groupe)
#将[替换为x[',[在正则表达式中是特殊字符,需要加\\转义
criterions_groupe <- gsub("\\[","x['",criterions_groupe)
#将]替换为'],]在正则表达式中是特殊字符,需要加\\转义
criterions_groupe <- gsub("\\]","']",criterions_groupe)
#将<-替换为< -,<-在R语言中表示赋值,而< -表示小于一个负数,区别在于中间是否有空格。
criterions_groupe <- gsub("<-","< -",criterions_groupe)
9、R语言中如何将一个字符串转化为命名行执行,y表示字符串:
eval(parse(text = y)
10、if~else的简单写法:
result <- ifelse(result == FALSE, 0, 1)
11、关于项目用到的apply家族函数
R语言提供了批量处理函数,可以循环遍历某个集合内的所有或部分元素,以简化操作。这些函数底层是通过C来实现的,所以效率也比手工遍历来的高效。批量处理函数有很重要的apply族函数:lapply sapply apply tapply mapply。apply族函数是高效能计算的运算向量化(Vectorization)实现方法之一,比起传统的for,while常常能获得更好的性能。
apply : 用于遍历数组中的行或列,并且使用指定函数来对其元素进行处理。
lapply : 遍历列表向量内的每个元素,并且使用指定函数来对其元素进行处理。返回列表向量。
sapply : 与lapply基本相同,只是对返回结果进行了简化,返回的是普通的向量。
mapply: 支持传入两个以上的列表。
tapply: 接入参数INDEX,对数据分组进行运算,就和SQL中的by group一样。
【例子1】:
#available_df是数据源,MARGIN=1表示按照行批处理,analysis_engine是一个自己编写的函数,c1=criterions_groupe表示将criterions_groupe赋值给c1,并将c1传入自定义函数analysis_engine中。
result <- apply(available_df, MARGIN=1, analysis_engine, c1=criterions_groupe)
#apply函数中再嵌套sapply函数。
analysis_engine <- function(x,c1){
merge_result <- sapply(c1, function(y) eval(parse(text = y))) #matrix
return(merge_result)
}
【例子2】:
criterions_parameters <- sapply(criterions_parameters,function(x) gsub('\\[','',x))
【例子3】:
#result是数据源,MARGIN=2表示按照列批处理,integration_engine是自己编写的函数
result <- apply(result, MARGIN=2, integration_engine) #matrix
12、利用read.table和read.csv读取数据时,如果表头中含有()或者表头以数字开头,都会出现表头被转义的情况,现象就是表头中出现小数点,解决办法是,在read.csv或者read.table时指定参数check.names = FALSE。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。