9-使用dplyr进行数据操作
2019-12-03 本文已影响0人
wonphen
一、数据说明
- int:表示整数型变量
- dbl:表示双精度浮点数型变量,或称实数
- chr:表示字符向量,或称字符串
- dttm:表示日期时间(日期+时间)型变量
- lgl:表示逻辑型变量,是一个仅包括TRUE和FALSE的向量
- fctr:表示因子,R用其表示具有固定数目的值的分类变量
- date:表示日期型变量
二、dplyr函数
- filter:按值筛选观测
- arrange:对行进行重新排序
- select:按名称选取变量
- mutate:使用现有变量的函数创建新变量
- summarize:将多个值总结为一个摘要统计量
三、读取数据
library(pacman)
p_load(dplyr, openxlsx)
df <- read.xlsx("C:/Users/Admin/Documents/R/data_set/选拔赛人员名单.xlsx",
sheet = 1, #读取第一个工作簿
startRow = 2, #第一行为标题,从第二行开始读取
colNames = T, #是否有列名
rowNames = F,#是否有行名
skipEmptyRows = T,#是否跳过空行
skipEmptyCols = T)#是否跳过空列
df <- tbl_df(df) #让输出适应宽度,更美观
names(df)
names(df)
四、对行的操作:sample、distinct、filter
1.随机选择N行
df1 <- sample_n(df, 3)
2.随机选择总行的N%
#随机返回10%的行
df2 <- sample_frac(df, 0.1)
3.基于所有变量删除重复行
df3 <- distinct(df)
4.基于单个变量删除重复行
#keep_all保留输出数据框中的所有其他变量
df4 <- distinct(df, Name, .keep_all = T)
5.基于多个变量删除重复行
df5 <- distinct(df, Name, ID_Number, .keep_all = T)
6.选择行
df12 <- filter(df, Minute == "52")
7.多重选择标准
df13 <- filter(df6, Minute %in% c(50:60))
8.选择标准中的"AND"条件
df14 <- filter(df6, Minute %in% c(50:60) & Class_2 == "MBDA/MEM")
9.选择标准中的"OR"条件
df15 <- filter(df6, Minute %in% c(50:60) | Class_2 == "MBDA/MEM")
10.非条件
df16 <- filter(df15, !Minute %in% c(50:60))
11.搜索模式匹配
df17 <- filter(df, grepl("女", gender))
五、对列的操作:select、rename
12.选择列
df6 <- select(df, Name, gender, Class_2:Minute)
13.删除变量(列)
df7 <- select(df6, -Phone_number)
14.选择或删除以P开头的变量
df8 <- select(df6, -starts_with('P'))
以下函数均可根据名称选择变量:
函数 | 作用 |
---|---|
starts_with("abc") | 匹配以abc开头的名字 |
ends_with("xyz") | 匹配以xyz结尾的名字 |
contains("ijk") | 匹配包含ijk的名称 |
matches("(.)\1") | 选择匹配正则表达式的那些变量 |
num_range("x",1:3) | x01,x02,x03这样的数值序列 |
one_of() | 字符向量之一 |
everything() | 所有变量 |
15.选择变量名中包含“M”的变量
df9 <- select(df, contains("M"))
16.重新排列变量
#Minute放在最前面
df10 <- select(df6, Minute, everything())
17.变量重命名
#将gender重命名为Gender
df11 <- rename(df6, Gender = gender)
六、总结:summarize
18.总结选定的变量
summ18 <- summarise(df13, Min_mean = mean(Minute), Min_med = median(Minute))
19.总结多个变量
summ19 <- summarise_at(df13, vars(Minute), funs(n(), mean, median))
20.用自定义的函数进行总结
summ20 <- summarise_at(df, vars(Minute),
funs(n(), missing = sum(is.na(.)),
mean(., na.rm = T),
median(., na.rm = T)))
21.总结所有的数字变量
#允许有条件的总结。先得处理缺失值
summ21 <- summarise_if(df, is.numeric, funs(n(), mean, median))
#或者
num_data <- df[sapply(df, is.numeric)]
summ21_2 <- summarise_all(num_data, funs(n(), mean, median))
22.总结因子变量
df22 <- df11 %>% mutate(Gender = as.factor(Gender))
summ22 <- summarise_all(df22["Gender"], funs(nlevels(.), nmiss = sum(is.na(.))))
23.按分类变量汇总数据
summ24 <- summarise_at(group_by(df, Class_2), vars(Minute), funs(n(), mean(., na.rm = T)))
#或者
summ24_2 <- df %>% group_by(Class_2) %>% summarise_at(vars(Minute), funs(n(), mean(., na.rm = T)))
24.过滤分类变量中的数据
df25 <- df %>% filter(Class_2 %in% c("MBDA/MEM", "IMBA")) %>% group_by(ID) %>% do(head(., 3))
25.通过分类变量选择第一最大值
df26 <- df %>%
select(Name, Class, Minute) %>%
filter(Class %in% c("2019级MBDA/MEM", "2019级MBA12")) %>%
group_by(Class) %>%
do(arrange(., desc(Minute))) %>%
#选择第一行
slice(1)
#或者
df26_2 <- df %>%
select(Name, Class, Minute) %>%
filter(Class %in% c("2019级MBDA/MEM", "2019级MBA12")) %>%
group_by(Class) %>%
filter(min_rank(desc(Minute)) == 1)
七、总结、分组和排序:summarize、group_by、arrange
27.按多个变量排序数据
df23 <- arrange(df22, Minute, Class_2)
#对其中一个降序,其他升序
df23_2 <- arrange(df22, desc(Minute), Name)
df27 <- df %>%
group_by(Class_2) %>%
summarise(mean_class = mean(Minute, na.rm = T)) %>%
arrange(desc(mean_class))
八、创建新变量:mutate
28.创建一个hours变量
df28 <- mutate(df, hours = Minute/60)
29.将所有变量改为hours乘以60,并用后缀_new命名
df29 <- mutate_all(df28, funs("new" = hours * 60))
30.计算变量的排名
df30 <- mutate_at(na.omit(df), vars(Minute), funs(Rank = min_rank(.)))