R語言資料處理60題
阿新 • • 發佈:2021-08-30
#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()