![b0b5259c7637130411a23520272f9336.png](https://img-blog.csdnimg.cn/img_convert/b0b5259c7637130411a23520272f9336.png)
前言
今天在微信公众号【早起Python】,看到有篇文章叫做【玩转数据处理120题】,最初来自【Pandas进阶修炼120题】,作者刘早起开始是用pandas实现的,后来又加入了中山大学博士陈熹的R语言版本。
但是这个R语言版本,代码比较陈旧和啰嗦,甚至是误解(比如R语言处理Excel文件不好之类,mutate与summarise混淆),根本没有体现出如今R语言在有了tidyverse之后,在数据处理上比python更加“简洁”和“优雅”。
所以,我打算利用R语言 tidyverse,也来玩转一下这个数据处理120题。同时也是为如今的R语言正名,不要停留在R语言不好用的老观念上。
本篇先来第1-20题。
题目1(创建数据框):将下面的字典创建为DataFrame
data = {"grammer": ["Python","C","Java","GO",np.nan,"SQL","PHP","Python"], "score":[1,2,np.nan,4,5,6,7,10]}
难度:★
代码及运行结果:
df = tibble(
grammer = c("Python","C","Java","GO", NA,"SQL","PHP","Python"),
score = c(1,2,NA,4,5,6,7,10)
)
df
![26c44ae539c70e01163ac95ef3d382f7.png](https://img-blog.csdnimg.cn/img_convert/26c44ae539c70e01163ac95ef3d382f7.png)
问题2(筛选行):提取含有字符串"Python"的行
难度:★
代码及运行结果:
df %>%
filter(grammer == "Python")
![55883303c6fba6d56111370e677848d9.png](https://img-blog.csdnimg.cn/img_convert/55883303c6fba6d56111370e677848d9.png)
题目3(查看列名):输出df的所有列名
难度:★
代码及运行结果:
names(df)
![c63074caf2aae489ce37abc8f9c8ccef.png](https://img-blog.csdnimg.cn/img_convert/c63074caf2aae489ce37abc8f9c8ccef.png)
题目4(修改列名):修改第2列列名为"popularity"
难度:★★
代码及运行结果:
df = df %>%
rename(popularity = score)
df
![bdafeaedf8bda50ef7988dda6e647819.png](https://img-blog.csdnimg.cn/img_convert/bdafeaedf8bda50ef7988dda6e647819.png)
题目5(统计频数):统计grammer列中每种编程语言出现的次数
难度:★★
代码及运行结果:
df %>%
count(grammer) # 或者用 table(df$grammer)
![fb4f7a7a156ac9fb146ba786504bc859.png](https://img-blog.csdnimg.cn/img_convert/fb4f7a7a156ac9fb146ba786504bc859.png)
题目6(缺失值处理):将空值用上下值的平均值填充
难度:★★★
代码及运行结果:
df = df %>%
mutate(popularity = zoo::na.approx(popularity))
df
![c265c4f130113ec8eaf72093933d0068.png](https://img-blog.csdnimg.cn/img_convert/c265c4f130113ec8eaf72093933d0068.png)
注:dplyr包提供了fill()函数,可以用前值或后值插补缺失值。
题目7(筛选行):提取popularity列中值大于3的行
难度:★★
代码及运行结果:
df %>%
filter(popularity > 3)
![5892ef4b5d409f3573cbfb96ec3f7374.png](https://img-blog.csdnimg.cn/img_convert/5892ef4b5d409f3573cbfb96ec3f7374.png)
题目8(数据去重):按grammer列进行去重
难度:★★
代码及运行结果:
df %>%
distinct(grammer, .keep_all = TRUE)
![0c94ad7d9ab67e7369c708d80f1d74a5.png](https://img-blog.csdnimg.cn/img_convert/0c94ad7d9ab67e7369c708d80f1d74a5.png)
题目9(数据计算):计算popularity列平均值
难度:★★
代码及运行结果:
df %>%
summarise(popularity_avg = mean(popularity))
![c5a4405f66fd4112e5b6b1b80d523f46.png](https://img-blog.csdnimg.cn/img_convert/c5a4405f66fd4112e5b6b1b80d523f46.png)
题目10(格式转换):将grammer列转换为序列
难度:★
代码及运行结果:
df$grammer
![3180dcb6bc7842720c26f7d073326a88.png](https://img-blog.csdnimg.cn/img_convert/3180dcb6bc7842720c26f7d073326a88.png)
注:R从数据框中提取出来就是字符向量。
题目11(数据保存):将数据框保存为Excel
难度:★★
代码及运行结果:
writexl::write_xlsx(df, "filename.xlsx")
题目12(数据查看):查看数据的行数列数
难度:★
代码及运行结果:
dim(df)
![9888e2ca45d20ecb179f41811efacdb1.png](https://img-blog.csdnimg.cn/img_convert/9888e2ca45d20ecb179f41811efacdb1.png)
题目13(筛选行):提取popularity列值大于3小于7的行
难度:★★
代码及运行结果:
df %>%
filter(popularity > 3 & popularity < 7)
![a55cce223e12484bc970d21204d12415.png](https://img-blog.csdnimg.cn/img_convert/a55cce223e12484bc970d21204d12415.png)
题目14(调整列位置):交互两列的位置
难度:★★
代码及运行结果:
df %>%
select(popularity, grammer)
![d68926483daceb4749b84c48edc1069a.png](https://img-blog.csdnimg.cn/img_convert/d68926483daceb4749b84c48edc1069a.png)
注:可配合everything()放置“其余列”,更强大的调整列位置的函数是dplyr1.0将提供的relacate().
题目15(筛选行):提取popularity列最大值所在的行
难度:★★
代码及运行结果:
df %>%
filter(popularity == max(popularity))
# 或者用df %>% top_n(1, popularity)
![00c2c79ed96b800b3f122ed256637f62.png](https://img-blog.csdnimg.cn/img_convert/00c2c79ed96b800b3f122ed256637f62.png)
题目16(查看数据):查看最后几行数据
难度:★
代码及运行结果:
tail(df) # 默认是最后6行
注:此外,head()查看前几行,dplyr包还提供了sample_n()和sample_frac()随机查看n行或某比例的行。
![4c6912d9e3a92e5f0b17892180c0cbcb.png](https://img-blog.csdnimg.cn/img_convert/4c6912d9e3a92e5f0b17892180c0cbcb.png)
题目17(修改数据):删除最后一行数据
难度:★★
代码及运行结果:
df %>%
slice(-n())
![bea0963330bce910501946115a944c5a.png](https://img-blog.csdnimg.cn/img_convert/bea0963330bce910501946115a944c5a.png)
题目18(修改数据):添加一行数据:"Perl", 6
难度:★★
代码及运行结果:
newrow = tibble(grammer="Perl", popularity=6)
df %>%
bind_rows(newrow)
![d22129de42a579c503f5c67741f41681.png](https://img-blog.csdnimg.cn/img_convert/d22129de42a579c503f5c67741f41681.png)
题目19(数据整理):对数据按popularity列值从到大到小排序
难度:★★
代码及运行结果:
df %>%
arrange(desc(popularity))
![c4641d387a32b7ce8908188e48a3e715.png](https://img-blog.csdnimg.cn/img_convert/c4641d387a32b7ce8908188e48a3e715.png)
注:不套一层desc(), 是默认从小到大排序。
题目20(字符统计):统计grammer列每个字符串的长度
难度:★★
代码及运行结果:
df %>%
mutate(strlen = str_length(grammer))
![6e345ff36921e9d4443bf5a49a8e29d9.png](https://img-blog.csdnimg.cn/img_convert/6e345ff36921e9d4443bf5a49a8e29d9.png)
参考文献
遥遥无期:玩转数据处理120题|Pandas版本zhuanlan.zhihu.com![61dcf5ced98fd8696ffe8d59d3f2759a.png](https://img-blog.csdnimg.cn/img_convert/61dcf5ced98fd8696ffe8d59d3f2759a.png)