df python 增加数据_【Note】关于玩转数据处理R语言120题的注解(P1-P50)
前言:
這是關于張敬信老師@張敬信的專欄R&Python數據科學中的文章:玩轉數據處理120題(R語言tidyverse版本)的個人自學筆記。敬信老師是我本科期間的恩師之一,非常感謝他提供的學習資源。題目和主要代碼均為敬信老師的原文內容,除此之外的注解為個人補充,如有錯誤,感激指正。
原來打算把敬信老師的120題在一篇文章中匯總出來,可是第一次在知乎上寫長文,我發(fā)現在網頁上寫太容易出現亂碼了,時不時就一長串亂碼,真的害怕碼了半天的字就沒了。于是寫到第50題就趕緊保存,然后另起一篇。不知道這是瀏覽器的原因還是知乎自己的原因,希望有人能不吝賜教。
#0(準備):需要的包
install.packages("tidyverse") install.packages("zoo") install.packages("writexl") library(tidyverse) library(zoo) library(writexl)#1(創(chuàng)建數據):創(chuàng)建數據框df
敬信老師:
df = tibble(grammer = c("Python","C","Java","GO", NA,"SQL","PHP","Python"), score = c(1,2,NA,4,5,6,7,10))# 創(chuàng)建數據框,包含有grammer列,score列,屬性為 a tibble: 8*2#2(篩選行):提取含有字符串python的行
敬信老師:
df %>%filter(grammer=="Python")# 提取所有grammer列為python的行敬信老師在這里用的是filter函數(篩選函數),允許對數據集取子集,第一個參數是數據框的名字(此處由于通過管道函數給定數據框為df),之后的參數是用于過濾數據框的表達式。
#3(查看列名):輸出df的所有列名
敬信老師:
names(df)#4(修改列名):修改第二列列名為popularity
敬信老師:
df = df %>%rename(popularity = score)# 重命名函數rename()#5(統計頻數):統計grammer列中每一種編程語言出現的次數
敬信老師:
df %>%count(grammer)# 計數函數count()#6(缺失值處理):將空值用上下值的平均值填充
敬信老師:
df = df %>%mutate(popularity = zoo::na.approx(popularity))# na.approx (in zoo package):計算插值替換NA值敬信老師在這里用的是mutate函數,關于mutate函數補充如下:
# 刪除grammer列的數據,即將null值賦予列 df %>%mutate(grammer=NULL)#7(篩選行):提取popularity列中值大于3的行
敬信老師:
df %>%filter(popularity > 3)#8(數據去重):按grammer列進行去重
敬信老師:
df %>%distinct(grammer, .keep_all = TRUE)# distinct()過濾多余的重復記錄只保留一條# .keep_all = TRUE顯示所有的變量, = FALSE只顯示降重列#9(數據計算):計算popularity列平均值
敬信老師:
df %>%summarise(popularity_avg = mean(popularity))# summarise()創(chuàng)建新的data frame# 可以實現分類匯總,見#24#10(格式轉換):將grammer列轉換為序列
敬信老師:
df$grammer#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)# select()僅保留提到的變量#15(篩選行):提取popularity列最大值所在的行
敬信老師:
df %>%filter(popularity == max(popularity))#16(查看數據):查看最后幾行數據
敬信老師:
tail(df) head(df) # tail默認最后6行,head默認前6行#17(修改數據):刪除最后一行數據
敬信老師:
df %>% slice(-n())# 刪除第n行的數據,即最后一行的數據敬信老師在這里用的是slice函數,關于slice函數補充如下:
# 如果選擇某一特定行數據,例如選取第三行: df %>% slice(3) # 如果刪去某一特定行數據,例如刪去第三行: df %>% slice(-3) # 如果選擇特定幾行數據,例如選取第3-5行: df %>% slice(3:5) # 如果刪去特定幾行數據,例如刪除第3-5行: df %>% slice(-(3:5))#18(修改數據):添加一行數據:"Perl", 6
敬信老師:
newrow = tibble(grammer="Perl", popularity=6)# 定義新的newrow,a tibble:1*2 df %>%bind_rows(newrow)# 使用bind_rows(),合并兩個tibble#19(數據整理):對數據按popularity列值從到大到小排序
敬信老師:
df %>%arrange(desc(popularity))敬信老師在這里用的是arrange函數(排序函數),關于arrange函數補充如下:
# 對數據按popularity列值從到小到大排序 df %>%arrange(popularity)#20(字符統計):統計grammer列每個字符串的長度
敬信老師:
df %>%mutate(strlen = str_length(grammer)# 使用mutate()函數對數據進行增加列# 定義strlen為新列,賦值為grammer的字符串長度Excel數據:https://pan.baidu.com/s/1-J-wGj1_5-kaByvyhDGOHA 提取碼:42yk
#21(讀取數據):讀取本地Excel數據
敬信老師:
df = readxl::read_xlsx("21-50數據.xlsx") # 需要保證數據在當前路徑,可通過setwd()設置#22(查看數據):查看df數據的前幾行(后幾行)
敬信老師:
head(df) # 查看前幾行 tail(df) # 查看后幾行#23(數據計算):將salary列數據轉換為最大值與最小值的平均值
敬信老師:
df = df %>%separate(salary, into = c("low", "high"), sep = "-") # 先將salary列分成兩列l(wèi)ow和high%>% mutate(salary = (parse_number(low) + parse_number(high)) * 1000 / 2)# 將low和high兩列的數字部分運算,賦值給salary# parse_number()指提取變量中的數字部分%>%select(-c(low, high))# 刪除low和high列# 也可以用#20的mutate函數刪除列#24(分組匯總):根據學歷分組,并計算平均薪資
敬信老師:
df %>% group_by(education) # 將數據中的education相同取值的數據進行分組聚類,tiblle屬性包括有Groups: education [4]%>% summarise(salary_avg = mean(salary))# 創(chuàng)建新的數據框data frame,包含有group,salary_avg敬信老師在這里用的是summarise函數(聚合函數),關于summarise函數補充如下:
# 創(chuàng)建新的數據框data frame,命名為salary,包含有group,salary_avg,salary_max,salary_min salary=df %>% group_by(education) %>% summarise(salary_avg = mean(salary),salary_max=max(salary),salary_min=min(salary))#25(時間轉換):將createTime列轉換為"月-日"
敬信老師:
library(lubridate)# 加載lubridate包 df %>% mutate(createTime = str_c(month(createTime), "-", day(createTime)))# 增加列createTime,包含有月份-日期# str_c合并字符串#26(查看數據):查看數據結構信息
敬信老師:
df %>% glimpse()# 查看數據結構信息 object.size(df)# 查看對象占用內存#27(查看數據):查看數據匯總信息
敬信老師:
summary(df)#28(修改列):新增一列將salary離散化為三水平值
敬信老師:
df = df %>%mutate(class = case_when(salary >= 0 & salary < 5000 ~ "低",salary >= 5000 & salary < 20000 ~ "中", TRUE ~ "高")) # 如果salary的取值在[0,5000),賦值class=低;# 如果salary的取值在[5000,20000),賦值class=中;# 如果salary的取值在[20000,+∞),賦值class=高;# TRUE的效果是其它,等效于salry>=20000敬信老師在這里用的是case_when函數,允許定義多個if_else()語句,等效于SQL中CASE WHEN 語句。
#29(數據整理):按salary列對數據降序排列
敬信老師:
df %>% arrange(desc(salary))# 同#19#30(篩選行):提取第33行數據
敬信老師:
df[33,] # 提取df數據框的第33行,所有列 # 或者 df %>% slice(33)#31(數據計算):計算salary列的中位數
敬信老師:
median(df$salary) # 對df中的salary列求中位數 # 或者如下 df %>% summarise(salary_med = median(salary))# 創(chuàng)建新的tibble 1*1,將salary列的中位數賦值給salary_med#32(數據可視化):繪制salary列的頻率分布直方圖
敬信老師:
df %>%ggplot(aes(x = salary)) +geom_histogram(bins = 10)# salary設定為x軸繪圖,設定圖形格式為直方圖,分為10組#33(數據可視化):繪制salary的頻率密度曲線圖
敬信老師:
df %>%ggplot(aes(x = salary)) +geom_density()# 同#32,設定圖形格式為密度曲線#34(數據刪除):刪除列class
敬信老師:
df %>% select(-class) # 選擇class列刪除 # 或者同#6的補充,給class列賦空值即刪去,如下 df %>%mutate(class = NULL)#35(數據操作):將df的第1列與第2列合并為新的一列
敬信老師:
df %>% unite("newcol", 1:2, sep = " ")敬信老師在這里用的是unite函數,關于unite函數的補充如下:
# "newcol"為合并列的新命名,1:2為合并1、2列,sep = " "為合并中間間隔空格 # 合并命名為newcol,1、2、3列,合并列由逗號區(qū)分,如下 df %>% unite("newcol", 1:2, sep = " ")#36(數據操作):將education列與第salary列合并為新的一列
敬信老師:
df %>% unite("newcol", c(education, salary), sep = " ")# 同#35#37(數據計算):計算salary最大值與最小值之差
敬信老師:
max(df$salary) - min(df$salary)#38(數據操作):將第一行與最后一行拼接
敬信老師:
bind_rows(df[1,], df[nrow(df),]) # 第一行df[1,] # 最后一行df[nrow(df),]#39(數據操作):將第8行添加到末尾
敬信老師:
bind_rows(df, df[8,]) #將第八行合并至末尾,同#38 %>% tail()# 顯示末尾行#40(查看數據):查看每一列的數據類型
敬信老師:
df %>% glimpse()# 同#26#41(數據操作):將createTime列設置為行索引
敬信老師:
df %>% distinct(createTime, .keep_all = TRUE) %>% column_to_rownames("createTime")#42(數據創(chuàng)建):生成一個和df長度相同的隨機數數據框
敬信老師:
df1 = tibble(rnums = sample.int(10, nrow(df), replace = TRUE)) df1 # 創(chuàng)建這樣的一個tibble數據框,將隨機數賦值給irnums,要求為:數據為10以內正整數,數量同df,可以重復#43(數據連接):將上面生成的數據框與df按列合并
敬信老師:
df = bind_cols(df, df1) df#44(修改列):生成新列new為salary列減去隨機數列
敬信老師:
df = df %>% mutate(new = salary - rnums)#45(檢查缺失值):檢查數據中是否含有任何缺失值
敬信老師:
anyNA(df)#46(類型轉換):將rnums列的類型轉換為浮點數
敬信老師:
df %>% mutate(rnums = as.double(rnums))# rnums為int型,使用as.double進行轉換,其他形式也類比#47(數據匯總):計算salary列大于10000的次數
敬信老師:
df %>% count(salary > 10000)# 同#5# 或者利用summarise函數進行匯總,如下 df %>% summarise(n = sum(salary > 10000))#48(統計頻數):查看每種學歷出現的次數
敬信老師:
df %>% count(education)# 同#5# 或者table(df$education)#49(數據匯總):查看education列共有幾種學歷
敬信老師:
df %>% distinct(education) # 同#8,此題默認.keep_all = FALSE,也就是除去education都不顯示#50(篩選行):提取salary與new列之和大于60000的最后3行
敬信老師:
df %>% filter(salary + new > 60000) # filter過濾出salary+new>6000的行 %>% slice((n()-2):n()) # slice選擇其中的后三行參考資料:
1.張敬信:玩轉數據處理120題之P1-P20(R語言tidyverse版本)
2.張敬信:玩轉數據處理120題之P21-P50(R語言tidyverse版本)
3. molearner:dplyr 數據操作 列操作(select / mutate)
4.小橙子:數據整理—dplyr包(summarise系列)
5.王詩翔:【r<-數據分析】使用dplyr(1):介紹與filter操作
6.張丹:R語言時間序列基礎庫zoo
7.張丹:R語言數據科學新類型tibble
8.g863402758:R語言數據類型轉化
總結
以上是生活随笔為你收集整理的df python 增加数据_【Note】关于玩转数据处理R语言120题的注解(P1-P50)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: aop拦截mybatis执行sql_Ja
- 下一篇: 安装archlinux_archlinu