常用数据处理功能


#2019-2-2
#常见功能整理
dt <- data.table(mtcars)
#返回dt的最后一条记录
dt[.N]#----------==============

#根据cyl分组,返回每个分组的记录数
dt[, list(total=.N), by = cyl]    #可以修改列名-------------

#返回第一行记录
dt[, .SD[1]]  #-----------------------
#返回以cyl分组后的每组的第一条记录#----------------
dt[, .SD[1], by = cyl] 
#以cyl分组,并对返回列求和,以及返回每组记录数
dt[, c(.N, lapply(.SD, sum)), by=cyl, .SDcols = hp:vs]  #要用C,而不能用list,-----------
#为对象dt添加组号
dt[, grp := .GRP, by=cyl]         #按照类别打标签,目前无法指定标签,自动打标签 ------------- 

#转换为data.table对象,并保留行名称
dt_rn <- data.table(mtcars, keep.rownames = TRUE)

#返回cyl为4和6的所有记录
dt_rn[cyl %in% c(4,6)]  #------------------多个筛选记录%in%---------------

#转换为data.table对象,并保留行名称
dt_rn <- data.table(mtcars, keep.rownames = TRUE)
#返回行名称以Merc开头的行
dt_rn[rn %like% "^Merc"]  #========================选择行
dt_rn[like(rn, "^Merc")]

dt_rn <- data.table(mtcars, keep.rownames = TRUE)#=================返回指定名称的记录
#返回指定名称的记录
dt_rn[rn %chin% c("Merc 280", "Merc 280C")]
dt_rn[chmatch(c("Merc 280", "Merc 280C"), rn)]

#筛选列名包含字符s的列
subset(dt_rn, select = grep("s", names(dt_rn)))#====================选择列 grep

#选择并重命名列
dt_rn[, .(rowname = rn)]  #================重命名

#转换为data.table对象,并保留行名称
dt_rn <- data.table(mtcars, keep.rownames = TRUE)
#以行名称排序
dt_rn[chorder(rn)]#------------a-Z
dt_rn[rev(chorder(rn))]#==============z-a


library(nycflights13)
#查看对象dt_flights包含的属性,多了一个sorted属性
names(attributes(dt_flights))#==========================查看属性

#修改key列的值
dt_flights[, time_hour := substr(time_hour, 12, 19)] #===============================字符串截取

#筛选origin == "LGA"的记录,返回data.table对象
dt_flights[.("LGA"),.(arr_delay)]#-===================报错
dt_flights[.("LGA"),"arr_delay", with = FALSE]#=============报错

#选择列
setorder(setDT(d), grp, -x)[, head(.SD, 5), by = grp]#grp升序,x降序



#==============dplyr================
#随机无重复的取10行数据===============随机取样,无重复
sample_n(mtcars, 10)
#随机有重复的取50行数据
sample_n(mtcars, 50, replace = TRUE)
#随机无重复的以mpg值做权重取10行数据=============值越大,权重越大,被选中的概率就越大。
sample_n(mtcars, 10, weight = mpg)


#返回能够与y表匹配的x表所有记录 
semi_join(x,y, by = NULL, copy = FALSE, ...)
#以CustomerId连接,返回df1中与df2匹配的记录
semi_join(df1, df2, by = c("CustomerId" = "CustomerId"))#================
  
  #以CustomerId和sex连接,返回df1中与df2不匹配的记录======================
anti_join(df1, df2)
#以CustomerId和sex连接,返回df1中与df2不匹配的记录
anti_join(df1, df2)

#按行合并数据框,生成id列指明数据来自的源数据框,id列的值使用数字代替=================
bind_rows(list(one, two), .id = "id")

#按列合并数据框one和two
bind_cols(one, two)


#ifelse===========================================================
x <- c(-5:5, NA)
#替换所有小于0的元素为NA,为了保持类型一致,因此使用NA_integer_
if_else(x < 0, NA_integer_, x)
#使用字符串missing替换原数据中的NA元素
if_else(x < 0, "negative", "positive", "missing")
#if_else不支持类型不一致,但是ifelse可以
ifelse(x < 0, "negative", 1)

x <- factor(sample(letters[1:5], 10, replace = TRUE))
#if_else会保留原有数据类型
if_else(x %in% c("a", "b", "c"), x, factor(NA))
ifelse(x %in% c("a", "b", "c"), x, factor(NA))

#casewhen ==============================================
x <- 1:50
case_when(
  x %% 35 == 0 ~ "fizz buzz",
  x %% 5 == 0 ~ "fizz",
  x %% 7 == 0 ~ "buzz",
  TRUE ~ as.character(x)
)


#缺失值的处理

#使用PimaIndiansDiabetes2数据集
require(mlbench)
data("PimaIndiansDiabetes2", package = 'mlbench')
#返回总的缺失值的个数和百分比(TRUE等价于1,FALSE等价于0)
sum(is.na(PimaIndiansDiabetes2))
mean(is.na(PimaIndiansDiabetes2))
#统计每行的缺失个数
rowmissing <- apply(PimaIndiansDiabetes2, 1,      
                    function(x){sum(is.na(x))})
#统计每列的缺失个数
colmissing <- apply(PimaIndiansDiabetes2, 2, 
                    function(x){sum(is.na(x))})

#返回没有缺失值的行
PimaIndiansDiabetes2[complete.cases(PimaIndiansDiabetes2),]
#返回包含一个或多个缺失值的行
PimaIndiansDiabetes2[!complete.cases(PimaIndiansDiabetes2),]


require(mice)
md.pattern(PimaIndiansDiabetes2)

require(VIM)
aggr(PimaIndiansDiabetes2, prop = FALSE, number = TRUE)

#转换数据框中元素为0,1形式,1表示数据缺失,0表示未缺失
pd <- as.data.frame(abs(is.na(PimaIndiansDiabetes2)))
#找出所有包含缺失值的列
pd_missing <- pd[, sapply(pd, function(x) {any( x == 1)})]
#含缺失数据的变量之间的相关系数
cor(pd_missing)

require(caret)
#装袋法对缺失值插补
preproc <- preProcess(PimaIndiansDiabetes2[-9], 
                      method="bagImpute")
data <- predict(preproc, PimaIndiansDiabetes2[-9])
data$diabetes <- PimaIndiansDiabetes2[, 9]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值