R常用函数

R ldboyghg 34℃ 0评论
# 打开Excel文件,拷贝相关交易数据
# read.table()具备从内存剪贴板中读取数据
TRData <- read.table(“clipboard”, header = T, sep = “\t”)
head(TRData)
读数据最基本的就是read.table,read.csv了吧,然而这效率呀,真的是不能恭维呀,某次几百兆的csv数据,等的花儿都谢了,直接上data.table包的fread呀,
某某次我想读xls文件,数据太大,马丹的用excel打不开呀打不开,所以就没办法转成csv了呗,这时候想起了readxl,openxlsx包,真他娘的好用呀,瞬间解决问题,
– 读取Excel数据
library(xlsx)
read.xlsx(“20161228.xlsx”,sheetIndex = 2,header = T)
x <- read.xlsx(“20161228.xlsx”,sheetIndex = 2,header = T,encoding = ‘UTF-8′)
rownames(x) <- x$dt
x %>% mutate(dt = as.Date(dt))
xts(变量, 日期)
output$gg1 <- renderDygraph({
dygraph(xts(df()$actual_pay/10000, df()$dt), main = ‘每日业绩/万’)
})
tagList(
fluidRow(class=’toolbar’,
#column(2, radioButtons(ns(‘dt_type’), ‘日期类型’, choices = c(‘付款日期’, ‘处理日期’), inline = TRUE)),
column(3, dateRangeInput(ns(‘dt’), ‘付款日期’, start = ‘2016-03-01′, end = ‘2016-03-31′, weekstart = 5, language = ‘zh_CN’))
),
fluidRow(
column(6, DT::dataTableOutput(ns(‘tbl’))),
column(6, dygraphOutput(ns(‘gg1′), height=’200px’),
dygraphOutput(ns(‘gg2′), height=’200px’),
dygraphOutput(ns(‘gg3′), height=’200px’)
)
)
布局:
拼接分组变量
r.interval = c(0, 30, 90, 180, 360)
lbl = paste(sprintf(‘%02d’, 1:length(r.interval)), paste(r.interval, c(r.interval[-1], ‘inf’),sep = ‘-‘), sep=':’)
月份日期
substr(as.character(seq(ymd(‘2016-02-01′), by=’month’, length.out = 12)-days(1)), 1, 7)
cumsum() 列 逐行合计
#fix na issue
#数据框空值修复
dd3[is.na(dd3)] <- 0
read.table 读大数据的时候加上stringsAsFactors=FALSE
stringsAsFactors=FALSE 是防止character类型的变量转化为factor型
省掉了对字符型进行转化这一步,
总归会快一点,不过要是读取的数据全是数值型,估计这个速度提升就有限了。
快速读入csv数据
fread (input=”zxy_flux.csv”)
gather  列转行
mini_iris <- iris[c(1, 51, 101), ]
x <- gather(mini_iris, key = flower_att, value = measurement,SepalLength, SepalWidth, PetalLength, PetalWidth)
spread  行转列
y <- spread(x , flower_att ,measurement)
dd1 <- dd %>%
filter(handle_status %in% c(0, 1, 4, 6, 99), pay_status==1, !is.na(payname)) %>%
group_by(dt, adminaccount, payname) %>%
summarise(
pay=sum(pay),
cnt=n_distinct(orderno)
) %>%
rename(金额=pay, 单数=cnt) %>%
gather(variable, value, -(dt:payname)) %>%
unite(temp, payname, variable) %>%
spread(temp, value) %>%
mutate(
`总成交_金额` = sum(`在线支付_金额`, `货到付款_金额`, na.rm=TRUE),
`总成交_单数` = sum(`在线支付_单数`, `货到付款_单数`, na.rm=TRUE)
)
–数据库数据过滤筛选
x <- head(iris[iris$Species==”setosa” , ]) –注意 , 后面空值, 表示筛选所有的列
–数据输出 :
cat(c(“AB”, “C”),c(“E”, “F”), “n”, sep=”/ “, file=”E:\\scripts\\R\\data\\data2.txt”)
province<-c(“四川”,”湖南”,”江苏”,”四川”,”四川”,”四川”,”湖南”,”江苏”,”湖南”,”江苏”)
> pf <- factor(province)
> pf
[1] 四川 湖南 江苏 四川 四川 四川 湖南 江苏 湖南 江苏
Levels: 湖南 江苏 四川
> levels(pf)
[1] “湖南” “江苏” “四川”
> score<-c(95,86,84,92,84,79,86,99,85,90)
> smeans<-tapply(score,pf,mean) –参数(score , province(因为levels是从pf 来的))的长度必需相同
> smeans
湖南 江苏 四川
85.66667 91.00000 87.50000
>
> tapply(score,pf,length)
湖南 江苏 四川
3 3 4
函数shapiro.test( )
P>0.05,正态性分布
–设置目录
setwd(“E:\\scripts\\R\\data”)
x <- read.csv(“register_member.csv”)
z <- zoo(x$members, order.by=as.Date(as.character(x$dt), format=’%Y%m%d’))
dygraph(z, group=’dashboard’) %>% dyAxis(“y”, label = “成单数”) %>%
dyEvent(“2016-06-09″, “6.9”, labelLoc = “bottom”) %>%
dyEvent(“2016-08-21″, “8.21”, labelLoc = “bottom”)
– 合并
– z <- merge(x,y) –默认 inner join
ts(z)
dygraph(ts(m) ) %>%
dyEvent(“2016-06-09″, “6.9”, labelLoc = “bottom”) %>%
dyEvent(“2016-08-21″, “8.21”, labelLoc = “bottom”)
–对数据库的某一列格式化 , 常有将字符串列转行成日期列
fitbit$date <- as.Date(fitbit$date, “%Y年%m月%d日”)
时间序列转换
library(xts)
setwd(“E:\\scripts\\R\\data”)
x <- read.csv(“register_member.csv”)
y <- head(x)
y$dt <- as.Date(as.character(y$dt),format = ‘%Y%m%d’)
z <- zoo(y$members,y$dt)
dygraph(z)
——————–数据框————————————–
student<-data.frame(
ID=c(11,12,13),
Name=c(“Devin”,”Edward”,”Wenli”),
Gender=c(“M”,”M”,”F”),
Birthdate=c(“1984-12-29″,”1983-5-6″,”1986-8-8″)
)
–数据框 列 的情况
student[1]
ID
11 11
12 12
13 13
– 表示数据框
> class(student[1])
[1] “data.frame”
> student[,1]
[1] 11 12 13
–向量数组
> class(student[,1])
[1] “numeric”
– 取第一二列
> idname<-student[1:2]
> idname
ID Name
11 11 Devin
12 12 Edward
13 13 Wenli
–数据框 行 的情况
> student[1,]
ID Name Gender Birthdate
11 11 Devin M 1984-12-29
查看数据框各列的数据类型
str(student)
‘data.frame': 3 obs. of 4 variables:
$ ID : num 11 12 13
$ Name : Factor w/ 3 levels “Devin”,”Edward”,..: 1 2 3
$ Gender : Factor w/ 2 levels “F”,”M”: 2 2 1
$ Birthdate: Factor w/ 3 levels “1983-5-6″,”1984-12-29″,..: 2 1 3
–改变字段类型
student$Name<-as.character(student$Name)
student$Birthdate<-as.Date(student$Birthdate)
使用attach和detach函数可以使得访问列时不需要总是跟着变量名在前面。
比如要打印所有Name,那么可以写成:
attach(student)
print(Name)
detach(student)
还可以换一种简洁一点的写法就是用with函数:
with(student,{
  n<-Name
  print(n)
})
添加新列
student$Age<- as.integer(format(Sys.Date(),”%Y”)) – as.integer(format(student$Birthdate,”%Y”))
这样写似乎太长了,我们可以用within函数,这个函数和之前提到过的with函数类似,可以省略变量名,不同的地方是within函数可以在其中修改变量,也就是我们这里增加Age列:
> student<-within(student,{
+ Age<-as.integer(format(Sys.Date(),”%Y”))-as.integer(format(Birthdate,”%Y”))
+ })
> student
ID Name Gender Birthdate Age
1 11 Devin M 1984-12-29 32
2 12 Edward M 1983-05-06 33
3 13 Wenli F 1986-08-08 30
within –添加字段
先声明一个字段 , 然后按条件赋值,条件语句并没有 , 号连接
df0 <- within(df0,{
type <- NA
type[sum_price < 674.860] <- “A”
type[sum_price >= 674.860 & sum_price <= 1615.360] <- “B”
type[sum_price >= 1615.360 & sum_price <=2930.202] <- “C”
type[sum_price >= 2930.202 & sum_price <= 5460.760] <- “D”
type[sum_price >=5460.760 & sum_price <= 8763.150] <- “E”
type[sum_price >= 8763.150 & sum_price <= 13625.120] <- “F”
type[sum_price >= 13625.120 & sum_price <= 22412.361] <- “G”
type[sum_price >= 22412.361 & sum_price <= 43661.800] <- “H”
type[sum_price >= 43661.800 & sum_price <= 89377.921] <- “I”
type[sum_price >= 89377.921 & sum_price <= 461861.250] <- “J” })
给列赋值
student$Age <- NA
> student
ID Name Gender Birthdate Age
1 11 Devin M 1984-12-29 NA
2 12 Edward M 1983-05-06 NA
3 13 Wenli F 1986-08-08 NA
>
–删掉列
> student$Age <- NULL
> student
ID Name Gender Birthdate
1 11 Devin M 1984-12-29
2 12 Edward M 1983-05-06
3 13 Wenli F 1986-08-08
–查询
查询/子集
如果我们使用布尔向量,配合which函数,可以实现对行的过滤。
student[which(student$Gender==”F”), ]
注意这里列Index并没有输入,如果我们只想知道所有女生的年龄,那么可以改为:
student[which(student$Gender==”F”),”Age”]
这样的查询写法还是复杂了点,可以直接使用subset函数,那么查询会简单些,比如我们把查询条件改为年龄<30的女性,查姓名和年龄,那么查询语句为:
subset(student,Gender==”F” & Age<30 ,select=c(“Name”,”Age”))
– 包查询
install.packages(“sqldf”)
library(sqldf)
result<-sqldf(“select Name,Age from student where Gender=’F’ “)
join 查询 merge 默认等连接
score<-data.frame(SID=c(11,11,12,12,13),Course=c(“Math”,”English”,”Math”,”Chinese”,”Math”),Score=c(90,80,80,95,96))
result<-merge(student,score,by.x=”ID”,by.y=”SID”)
union all
需要用到rbind函数。
rbind的两个Data Frame必须有相同的列,比如我们再申明一个student2,将两个变量rbind起来:
student2<-data.frame(ID=c(21,22),Name=c(“Yan”,”Peng”),Gender=c(“F”,”M”),Birthdate=c(“1982-2-9″,”1983-1-16″),Age=c(32,31))
student3 <- rbind(student,student2)

转载请注明:生命不息,奋斗不止 » R常用函数

喜欢 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址