#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]
常用数据处理功能
最新推荐文章于 2023-07-21 00:40:07 发布