#author lee
#date 2021.8.26
library(tidyverse)
#1创建数据
df <- data.frame(
"grammer" = c("Python","C","Java","GO",NA,"SQL","PHP","Python"),
"score" = c(1,2,NA,4,5,6,7,10)
)
df
#2指定行提取
#df[which(df$grammer == 'Python'),]
df %>% filter(grammer == "Python")
#3提取列名
names(df)
#colnames(df)
#4数据修改,根据索引,方法1
#names(df)[2]<-paste("score")
#colnames(df)[2]<-"score"
#4数据修改,根据名称,方法2
#names(df)[names(df)=="score"]<-"popularity"
#colnames(df)[names(df)=="score"]<-"popularity"
#4数据修改,更改列名,方法3
options(warn=-1)#忽视警告信息
df<-df %>% rename(popularity = score)#修改后的在前
#5统计grammar每种编程语言中语言的次数
table(df$grammer)#行的形式
df %>% count(grammer)#列的形式
#7(筛选行),提取popularity大于3的行
df %>% filter(popularity>3)
#8(数据去重复),按照grammar列去除重复
df %>% distinct(grammer, .keep_all = TRUE)
#9(数据计算)计算popularity的平均值
df %>% summarise(popularity_avg=mean(popularity))
#10(格式转换)将grammar列转换为序列
df$grammer#R语言中,从数据框中提取出来就是字符向量
#11数据保存,保存为excel
writexl::write_xlsx(df,"filename.xlsx")
#12查看数据的行数和列数
dim(df)
#13筛选行,筛选popularity大于3小宇7的行
df %>% filter(popularity >3 & popularity <7)
#14交换两列的位置
df %>% select(popularity,grammer)
#15筛选行,提取popularity最大值所在的行
df %>% filter(popularity == max(popularity,na.rm = TRUE))#这里由于一开始没有对NA进行处理,所以报错了,需要加上na.rm
df %>% top_n(1,popularity)
#16查看最后几行的数据
tail(df)
#17删除最后一行数据
df %>% slice(-n())
#18修改数据,添加一行数据“perl”,6
newrow = tibble(grammer="perl",popularity=4)
df %>% bind_rows(newrow)
#19数据整理,对数据按照popularity列从大到小排序
df %>% arrange(desc(popularity))#不加desc,从小到大排序
#20统计grammar列每个字符串的长度
df %>% mutate(str_grammar=str_length(grammer))
#21读取本地excel数据
df<- readxl::read_xlsx("test.xlsx")
#22查看数据的前几行,后几行,类似linux
head(df)
tail(df)
dim(df)
#23将salary列转换为最大值与最小值的平均值
df<-df %>% separate(salary,into = c("low","high"),sep = "-") %>%
mutate(salary=(parse_number(low)+parse_number(high))*1000/2) %>%
select(-c(low,high))
#24分组汇总,根据学历分组,并计算平均薪资
df %>% group_by(education) %>%
summarise(salary_ave=mean(salary))
#26查看数据结构信息
str(df)
#27查看数据汇总信息,最小值,最大值,平均值
summary(df)
#28新增一列将salary离散成三水平
df<-df %>% mutate(class=case_when(salary>=0 & salary< 5000 ~"low",
salary>5000 & salary<15000 ~'middle',
TRUE~"high"))
#29按照salary进行降序排列
df %>% arrange(desc(salary)) %>%
head()
#30提取第3行数据
df %>% slice(3)
#32绘制salary的频率分布直方图
df %>% ggplot(aes(x=salary))+geom_histogram(bins = 10)
#33,绘制salary的频率密度曲线图
df %>% ggplot(aes(x=salary))+geom_density()
#34数据删除,删除最后一列class
df %>% select(-class) %>% head()
#35,36 将df的第一列与第二列合并为新的一列
df %>% unite("newcol",1:2,sep = "")
df %>% mutate(Newcol=paste(education,salary,sep = "-"))#transmute,只保留新列
#37数据计算
df %>% summarise(range=max(salary)-min(salary))
#38拼接第一行和最后一行
bind_rows(df[1,],df[nrow(df),])
#39将第3行添加到末尾
bind_rows(df,df[3,])
#40查看每一列的数据类型
str(df)
#41将第一列设置为索引,distinct,用于去除重复,索引不能有重复
df %>% distinct(createTime,.keep_all = TRUE) %>%
column_to_rownames("createTime") %>%
head()
#42生成一个和df等长的随机数据框
df1<-tibble(rnums=sample.int(10,nrow(df),replace = TRUE))
#43合并生成的数据框
df<-bind_cols(df,df1)
#44生成新列new,为salary减去随机数列
df<- df %>% mutate(new=salary-rnums)
#45检查缺失值,检查数据中是否含有任何缺失值
anyNA(df)
anyNA(df$salary)
#46将salary列的类型转换为浮点数
df %>% mutate(rnums=as.double(rnums)) %>%
head()
#47计算salary列大于10000的次数
df %>% summarise(n=sum(salary>10000))
df %>% count(salary>10000)
#48统计每种学历出现的次数
table(df$education)
df %>% count(education)
#49查看education列共有几种学历
df %>% distinct(education)
#50提取salary与new列之和大于60000的最后三行
df %>% filter(salary+new >50000) %>%
slice((n()-2):n())
df %>% filter(salary+new >50000) %>%
slice_tail(n=3)
#51使用绝对路径读取本地EXcel数据
df<-readxl::read_xls("51-80.xls")
#52查看数据框的前三行
df %>% head(3)
head(df,3)
#53查看每列趋势之状况
anyNA(df)
if(!require("naniar")) install.packages("naniar")
library(naniar)
df %>% miss_var_summary()
#54查看日期列含有缺失值的行
df %>% filter(is.na(日期))
#55查看每列缺失值在哪些行
naIdx<-df %>% where_na() #返回na的行列索引
split(naIdx[,1], naIdx[,2])#提取对应的行列
#56删除所有含有缺失值的行
df %>% drop_na()
#57绘制收盘价的折线图
df %>%
ggplot(aes(日期, `收盘价(元)`)) +
geom_line()
#58同时绘制开盘价与收盘价
df %>%
select(日期,`开盘价(元)`,`收盘价(元)`) %>%
pivot_longer(-日期,names_to = "type",values_to = "price")%>%
ggplot(aes(日期,price,col=type))+geom_line()
#59绘制涨跌幅的直方图
df %>% ggplot(aes(`涨跌幅(%)`))+geom_histogram()
#60让直方图更细致,bin更多
df %>% ggplot(aes(`涨跌幅(%)`))+geom_histogram(bins = 40)
#61用df的列名创建数据框
as_tibble(names(df))
#62输出所有换手率不是数字的行
df %>%
mutate(`换手率(%)`= parse_number(`换手率(%)`)) %>%
filter(is.na(`换手率(%)`))
#63输出所有换手率为--的行
df %>%
filter(`换手率(%)` == "--")
#64充值df的行号
rownames(df) =NULL# R中无行号就是数字索引
#65删除所有换手率不是数字的行
df %>%
mutate(`换手率(%)`= parse_number(`换手率(%)`)) %>%
filter(!is.na(`换手率(%)`))
#66绘制换手率的密度图
df %>%
ggplot(aes(`换手率(%)`))+geom_density()