1. 程式人生 > 其它 >R語言資料處理60題

R語言資料處理60題

#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()