数据清洗和整理:
总结整理的各种资源,包括使用dplyr包以及R自带的函数等等,主要用于数据预处理
筛选各种变量select()根据一个或者多个变量进行排序arrange()变量重命名以及增加新的变量names()或者colnames()&mutate()根据某个变量进行分类汇总summarize()简单随机抽样sample()各种连接inner_join()等按行或者按列进行合并rbind()或者cbind()使用R中的数据
library(nycflights13) library(dplyr)1.筛选符合条件的数据
同样的效果,都是从数据集flight_df中筛选出变量
data1<-filter(flights_df, month == 1, day == 1) flights_df[flights_df$month == 1 & flights_df$day == 1, ] 上面这段代码类似于sql中的select语句 select * from flights_dt where month=1 and day=1 2.筛选某些变量 通过列名来选择 select(flights_df, year, month, day) 通过 :来选择 select(flights_df, year:day) 通过 - 来去掉不需要的变量 select(flights_df, -(year:day))3.排序
将flights_df数据集按照year,month,day的升序排列
arrange(flights_df, year, month, day)
如果按照单个变量进行排序的话,也可以使用sort()函数
decreasing默认是F,升序排列,如果是T那么就是降序排列
na.list默认是F,去掉缺失值NA,如果是T那么就是不去掉缺失值,缺失值在最后
sort(filghts$year,decreasing=F, na.last= F)order函数也是排序,但是返回的是元素所在的位置
order(filghts$year,decreasing=F, na.last= F) flights[order(-flights$month),]
上面这段代码类似于sql中的order by语句
select * from flights_dt order by year,month,day desc4.给列命名
如果数据集为数据框data.frame,那么可以使用fix(flights)就可以打开数据编辑器,在里面直接修改就可以
如果数据集为列表list,使用names()函数或者colnames()函数进行重命名,代码如下:
> names(flights_cs)#首先查看列名 [1] "year" "month" "day" > colnames(flights_cs)<-c("year","day","week")#给列重新命名 > names(flights_cs)#看到列名已经通过colnames函数更改 [1] "year" "day" "week" > names(flights_cs)<-c("a","b","c")#使用函数names进行命名 > names(flights_cs)#查看最新的列名 [1] "a" "b" "c"5.产生新的列
如下代码在数据集flights中产生了gain和speed两列
flights_new<-mutate(flights, gain=arr_delay - dep_delay, speed=distance / air_time * 60) 6.随机抽取样本在数据集中随机抽取10个样本,不放回
sample(flights,10,replace=TRUE) 在数据集中随机抽取四分之三的数据为训练集,四分之一的数据为测试集 set.seed(1) sub<-sample(1:nrow(flights),round(nrow(flights)/4)) data_train<-flights[-sub,]#训练集 data_test<-flights[sub,]#测试集7.分类汇总 进行简单的计算,比如求某一列的均值 summarise(flights,mean(distance)) 按某一列进行分组,得到新的数据 by_tailnum <- group_by(flights, tailnum) 分组以后,统计每组的个数,求每组的distance的均值 delay <- summarise(by_tailnum, count = n(), dist = mean(distance)) 总结:上面group_by()以及summarize()函数中都有数据集名flights,还有一种通过引入%>%的方法,不在函数中使用数据集名 flights %>% group_by(year, month, day) %>% select(arr_delay, dep_delay) %>% summarise( arr = mean(arr_delay), dep = mean(dep_delay) ) %>%
8.各种连接
inner_join #内连接 left_join #左连接 right_join #右连接 full_join #全连 semi_join # 返回能够与y表匹配的x表所有记录 anti_join # 返回无法与y表匹配的x表的所有记录
> options(warn =-1)#这个是忽略警告,默认warn=0是提示警告 > library(dplyr) > df1 <- data.frame(x = c('a','b','c'), y = c('A','B','C')) > df2 <- data.frame(x = c('a','b','d'), z = c(1,2,3)) > inner_join(df1,df2) #内连接 Joining, by = "x" x y z 1 a A 1 2 b B 2 > left_join(df1,df2) #左连接 Joining, by = "x" x y z 1 a A 1 2 b B 2 3 c C NA > right_join(df1,df2) #右连接 Joining, by = "x" x y z 1 a A 1 2 b B 2 3 d <NA> 3 > full_join(df1,df2) #全连 Joining, by = "x" x y z 1 a A 1 2 b B 2 3 c C NA 4 d <NA> 3 > semi_join(df1,df2) # 返回能够与df2表匹配的df1表所有记录 Joining, by = "x" x y 1 a A 2 b B > anti_join(df1,df2) # 返回无法与df2表匹配的df1表的所有记录 Joining, by = "x" x y 1 c C9.按行或者按列进行合并
注意:对应变量的数据类型必须相同
按行合并:rbind()#增加行数
按列合并:cbind()以及merge()#增加列数
其中merge只按照共同的变量进行合并,作用类似于inner_join
> sj1 <- data.frame(x = c('a','b','c'), y = c('A','B','C')) > sj2<- data.frame(x = c('a','b','d'), y = c("H","I","J")) > rbind(sj1,sj2) x y 1 a A 2 b B 3 c C 4 a H 5 b I 6 d J > cbind(sj1,sj2) x y x y 1 a A a H 2 b B b I 3 c C d J > merge(sj1,sj2,by="x") x y.x y.y 1 a A H 2 b B I