前言:

这是关于张敬信老师@张敬信的专栏R&Python数据科学中的文章:玩转数据处理120题(R语言tidyverse版本)的个人自学笔记。敬信老师是我本科期间的恩师之一,非常感谢他提供的学习资源。
题目和主要代码均为敬信老师的原文内容,除此之外的注解为个人补充,如有错误,感激指正。
原来打算把敬信老师的120题在一篇文章中汇总出来,可是第一次在知乎上写长文,我发现在网页上写太容易出现乱码了,时不时就一长串乱码,真的害怕码了半天的字就没了。于是写到第50题就赶紧保存,然后另起一篇。不知道这是浏览器的原因还是知乎自己的原因,希望有人能不吝赐教。


#0(准备):需要的包

install.packages("tidyverse")
install.packages("zoo")
install.packages("writexl")
library(tidyverse)
library(zoo)
library(writexl)

#1(创建数据):创建数据框df

敬信老师:

df = tibble(grammer = c("Python","C","Java","GO", NA,"SQL","PHP","Python"), score = c(1,2,NA,4,5,6,7,10))# 创建数据框,包含有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()创建新的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列分成两列low和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))# 创建新的数据框data frame,包含有group,salary_avg

敬信老师在这里用的是summarise函数(聚合函数),关于summarise函数补充如下:

# 创建新的数据框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))# 创建新的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列,合并列由逗号区分,如下
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(数据创建):生成一个和df长度相同的随机数数据框

敬信老师:

df1 = tibble(rnums = sample.int(10, nrow(df), replace = TRUE))
df1
# 创建这样的一个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)相关推荐

  1. df python 增加数据_美国确诊超100万!教你用Python画出全球疫情动态图(附数据下载)...

     CDA数据分析师 出品   [导语]:今天我们教你用Python绘制全球疫情动态图,技术部分请看第二部分. 获取数据:扫描下方公众号回复关键字"全球疫情" 目前,全球新冠疫情还十 ...

  2. r语言清除变量_如何优雅地计算多变量 | R语言进阶

    社会科学研究经常会遇到"超多变量"的情况--多量表.多维度.多题项,以及复杂的正反计分题--如何更高效地计算量表总分?如何更简洁地进行反向计分?传统的统计工具(Excel.SPSS ...

  3. R语言基础题及答案(一)——数组、数据框、list列表的创建及部分基础问题

    数组.数据框.list列表的创建及部分基础问题 数列 题-1 请构造如下数列:1,2,3,4,5,6,7,8 1:8 seq(from=1,to=8) [1] 1 2 3 4 5 6 7 8 [1] ...

  4. r语言软件GDINA_finTech MSc代做、代写Python程序语言、代写MSc program、代做Python设计帮做C/C++编程|代写R语言...

    finTech MSc代做.代写Python程序语言.代写MSc program.代做Python设计帮做C/C++编程|代写R语言Strathclyde Business School, finTe ...

  5. 【R语言数据科学】:(二)R语言编程

    [R语言数据科学]:(二)R语言编程基础

  6. python葡萄酒数据_用python进行葡萄酒质量预测

    python葡萄酒数据 Warning: This is long article for those who seek only machine learning code, please just ...

  7. 怎么用python分析数据_如何用python进行数据分析?

    .Python数据分析流程及学习路径 数据分析的流程概括起来主要是:读写.处理计算.分析建模和可视化四个部分.在不同的步骤中会用到不同的Python工具.每一步的主题也包含众多内容. 根据每个部分需要 ...

  8. 宏转录组方法_最后一周|高级转录组分析和R语言数据可视化第十二期 (线上线下同时开课)...

    "福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组.Python课程线上直播课.报名参加线上直播课的老师可在1年内选择参加同课程的一次线下 ...

  9. r语言中残差与回归值的残差图_独家 | 手把手教你用R语言做回归后的残差分析(附代码)-阿里云开发者社区...

    作者:Abhijit Telang 翻译:张睿毅 校对:丁楠雅 文章来源:微信公众号 数据派THU 本文介绍了做残差分析的方法及其重要性,以及利用R语言实现残差分析. 在这篇文章中,我们通过探索残差分 ...

最新文章

  1. 浅谈javascript中的数据类型和引用类型
  2. Java 数组转 List 的三种方式及对比
  3. Could not connect to Redis at IP No route to host
  4. 期盼数月的召唤|PaddlePaddle中文文档利剑来袭
  5. Arcgis Javascript那些事儿(七)--AMD详解
  6. SQL处理非常见空串
  7. hashmap java 排序_HashMap的排序
  8. Java工程师学习指南(完结篇)
  9. 模块化存储区域网络(SAN)解决方案的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  10. Visual studio 2015(VS2015)的下载和安装,以及安装VS2015中的C++
  11. 谁还说我没表情包用?马上用Python采集上万张个表情包
  12. dilated convolution
  13. 数据库锁与加锁情况介绍(记录锁、间隙锁、next-key锁)
  14. 漂亮英文翻译(关于爱的经典句子)
  15. 大学生、办公人员电脑必备的10款实用软件 简直是太好用了
  16. 计算1+3+5+....+99的和
  17. Java、计算平均值和标准方差
  18. Flink系列之:基于scala语言实现flink实时消费Kafka Topic中的数据
  19. Android 图片Loading旋转动画效果
  20. java下载文件下载不动_java文件下载的问题

热门文章

  1. 直播预告 | AAAI 2022论文解读:对称的语义感知的妆容迁移与移除网络
  2. 手把手带你掌握计算机视觉原始论文细节阅读
  3. ICML 2020 | 基于连续动态系统学习更加灵活的位置编码
  4. 基于深度学习的多目标跟踪:从UMA Tracker出发谈谈SOT类MOT算法
  5. 工业界推荐系统必读论文:基于深度学习的推荐模型——DLRM
  6. python将字典导入excel_python将字典列表导出为Excel文件的方法
  7. 安卓scrollview无法滑动_安卓上线前,小光有话想对你们说
  8. SpringBoot 集成 clickhouse + mybatis-plus 配置及使用问题说明(含建表语句、demo源码、测试说明)
  9. RabbitMQ之呕心沥血的总结(图文并茂、万字级别、毕生所学)
  10. 使用R语言绘制层次聚类热图