写在前面
本包开发者黄天元;
首先我对tidyfst进行了一套完整的学习,因为这里面的函数并不多,满打满计算,也就38个。
随着扩增子的平稳,我逐渐转入宏基因组,软件更多,平台跨度更大,R语言显示出来很多弊端:
- 数据处理过程不够快,无法快速读入,输出;
近年来出现了许多工具解决这个问题,本着适合之前的习惯,我想通过data.table和tadyfst解决这个问题。希望我这一路都是顺畅的。结果会如我所料吗?
tidyfst包(fstpackage/fst)
它的优势:
1、快速读写数据框
2、文件压缩,保存数据框能够给文件进行压缩,这就节省了大数据转移的时间(从硬盘放到电脑或者上传服务器)。压缩的比率是非常感人的,有一个参数可以控制压缩比例,我一般设置到最大。我问过原作者,他跟我解释过,压缩比例一共是100个等级,不压缩的时候读写是最快的,但是使劲压缩,读写依然非常快!亲测确实如此,所以我每次都用最大等级的压缩,并包装了他的函数,把默认压缩率改为100(默认值为50)。
测试 fst格式操作
为什么我要测试这个呢?因为fst更快。
构造一个巨大的数据框,代码参考hopeR。
library(tidyfst)
# 构造一个1亿行,4列的数据框
nr_of_rows <- 1e8
df <- data.table(
Logical = sample(c(TRUE, FALSE, NA), prob = c(0.85, 0.1, 0.05), nr_of_rows, replace = TRUE),
Integer = sample(1L:100L, nr_of_rows, replace = TRUE),
Real = sample(sample(1:10000, 20) / 100, nr_of_rows, replace = TRUE),
Factor = as.factor(sample(labels(UScitiesD), nr_of_rows, replace = TRUE))
)
打印出文件大小
head(df)
object.size(df) %>% print(unit = "auto")
我们测试一下保存,查看保存时间。sys_time_print函数是作者在tidyfst中封装的函数。
# ?export_fst
sys_time_print({
export_fst(df,"./df.fst")
})
# 完成后删除df数据框
rm(df)
读入fst对象
parse_fst("./df.fst") -> ft
##--输出错误
# ft
head(ft)
colnames(ft)
快速计算频数
fst数据处理的函数后缀位:_fst,这里select_fst函数用于选择列。
sys_time_print({
ft %>%
select_fst(Logical) %>%
count_dt(Logical) -> res
})
res
slice_fst:用于选择行操作。然后分组求和
sys_time_print({
ft %>%
slice_fst(1:1000) %>%
group_dt(
by = Factor,
summarise_dt(avg_int = mean(Integer))
)-> res
})
res
filter_fst函数用于列过滤。count_dth函数用于统计频数
sys_time_print({
ft %>%
filter_fst(Real >= 50) %>%
count_dt(Factor)-> res
})
res
删除本地数据
unlink("./df.fst")
tidyfst 正式 学习
这个包处理函数很快,所以我要将这个包用于宏基因组数据探索,这里
1 arrange_dt :排序
#--使用数据
data(iris)
#---按照数值进行排序
iris %>% arrange_dt(Sepal.Length)
iris
# 从大到小排序
iris %>% arrange_dt(-Sepal.Length)
# 双重排序--先按照第一个拍排序,然后在此基础上按照第二列排序
iris %>% arrange_dt(Sepal.Length,Petal.Length)
2 as_fst:将数据框转化位fst对象
iris %>%
as_fst() -> iris_fst
head(iris_fst)
3 complete_dt函数
将数据框按照指定列,进行完整组合,输出
Complete a data frame with missing combinations of data
df <- data.table(
group = c(1:2, 1),
item_id = c(1:2, 2),
item_name = c("a", "b", "b"),
value1 = 1:3,
value2 = 4:6
)
df
df %>% complete_dt(item_id,item_name)
df %>% complete_dt(item_id,item_name,fill = 0)
df %>% complete_dt("item")
df %>% complete_dt(item_id=1:3)
df %>% complete_dt(item_id=1:3,group=1:2)
df %>% complete_dt(item_id=1:3,group=1:3,item_name=c("a","b","c"))
4 count_dt:统计频数
iris %>% count_dt(Sepal.Width)
#-指定频数列名称
iris %>% count_dt(Species,.name = "count")
#统计频数并添加到源数据列
iris %>% add_count_dt(Species)
# 对添加列的命名
iris %>% add_count_dt(Species,.name = "N")
#按照两组分类进行统计频数
mtcars %>% count_dt(cyl,vs)
# 频数列重命名,默认是排序的,现在不要排序了
mtcars %>% count_dt(cyl,vs,.name = "N",sort = FALSE)
#添加到源数据中
mtcars %>% add_count_dt(cyl,vs)
5 cummean:累积均值
cummean(1:10)
6 distinct_dt :去除重复
iris %>% distinct_dt()
iris %>% distinct_dt(Species)
iris %>% distinct_dt(Species,.keep_all = TRUE)
mtcars %>% distinct_dt(cyl,vs)
mtcars %>% distinct_dt(cyl,vs,.keep_all = TRUE)
7 drop_na_dt :去除NA行
df <- data.table(x = c(1, 2, NA), y = c("a", NA, "b"))
df
#去除含有NA的全部行
df %>% drop_na_dt()
#去除x列含有NA的全部行
df %>% drop_na_dt(x)
#去除y列含有NA的全部行
df %>% drop_na_dt(y)
# 去除x,y列含有NA的全部行
df %>% drop_na_dt(x,y)
# 将NA替换为0
df %>% replace_na_dt(to = 0)
df %>% replace_na_dt(x,to = 0)
df %>% replace_na_dt(y,to = 0)
df %>% replace_na_dt(x,y,to = 0)
# 对空缺值的填充
#仅仅填充x列
df %>% fill_na_dt(x)
#全部填充
df %>% fill_na_dt() # not specified, fill all columns
#指定使用临近下一行数据填充
df %>% fill_na_dt(y,direction = "up")
#x的空缺在最后,所以无法填充
df %>% fill_na_dt(x,direction = "up")
x = data.frame(x = c(1, 2, NA, 3), y = c(NA, NA, 4, 5),z = rep(NA,4))
x
#--删除全部为NA的列
x %>% delete_na_cols()
#-删除0.75数据未NA的列
x %>% delete_na_cols(prop = 0.75)
x %>% delete_na_cols(prop = 0.5)
x %>% delete_na_cols(prop = 0.24)
#删除数据少于2个的列
x %>% delete_na_cols(n = 2)
#删除低于0.6数据的行
x %>% delete_na_rows(prop = 0.6)
#删除数据少于两个的行
x %>% delete_na_rows(n = 2)
# shift_fill
y = c("a",NA,"b",NA,"c")
y
#填充
shift_fill(y) # equals to
#
shift_fill(y,"down")
shift_fill(y,"up")
8 dummy_dt:数据长变宽
iris %>% dummy_dt(Species)
#使用源名称
iris %>% dummy_dt(Species,longname = FALSE)
## 按照两列进行变宽
mtcars %>% head() %>% dummy_dt(vs,am)
mtcars %>% head() %>% dummy_dt("cyl|gear")
9 export_fst :fst格式数据保存
export_fst(iris,"iris_fst_test.fst")
iris_dt = import_fst("iris_fst_test.fst")
iris_dt
unlink("iris_fst_test.fst")
10 filter_dt :行筛选
iris %>% filter_dt(Sepal.Length > 7)
iris %>% filter_dt(Sepal.Length > 7,Sepal.Width > 3)
iris %>% filter_dt(Sepal.Length > 7 & Sepal.Width > 3)
iris %>% filter_dt(Sepal.Length == max(Sepal.Length))
11 slice_fst:选择行;select_fst:选择列;filter_fst按照行过滤
这几个函数其实就是来处理fst格式的,会进一步缩短时间。大数据必备。
## Not run:
fst::write_fst(iris,"iris_test.fst")
# parse the file but not reading it
parse_fst("iris_test.fst") -> ft
# ft
class(ft)
lapply(ft,class)
names(ft)
dim(ft)
# 选择前三行
ft %>% slice_fst(1:3)
# 选择1,3行
ft %>% slice_fst(c(1,3))
ft %>% select_fst(Sepal.Length)
ft %>% select_fst(Sepal.Length,Sepal.Width)
ft %>% select_fst("Sepal.Length")
ft %>% select_fst(1:3)
ft %>% select_fst(1,3)
ft %>% select_fst("Se")
ft %>% select_fst("nothing")
ft %>% select_fst("Se|Sp")
ft %>% select_fst(cols = names(iris)[2:3])
ft %>% filter_fst(Sepal.Width > 3)
ft %>% filter_fst(Sepal.Length > 6 , Species == "virginica")
ft %>% filter_fst(Sepal.Length > 6 & Species == "virginica" & Sepal.Width < 3)
unlink("iris_test.fst")
12 group_by_dt;分组
这里结合head函数可以对每个分组的前面几行进行计算,这个如果结合排序,可以对丰富较高或者较低的进行统计。
# aggregation after grouping using group_exe_dt
as.data.table(iris) -> a
# ?group_exe_dt
#---指定分组,这里的head函数会按照分组进行展示-这一般用的比较少
a %>%
group_by_dt(Species) %>%
group_exe_dt(head(3))
a
#----指定分组,进行计算,对每个分组的前四行进行计算
a %>%
group_by_dt(Species) %>%
group_exe_dt(
head(4) %>%
summarise_dt(sum = mean(Sepal.Length))
)
#--指定两个分组进行计算
mtcars %>%
group_by_dt("cyl|am") %>%
group_exe_dt(
summarise_dt(mpg_sum = sum(mpg))
)
# 同上一个函数
mtcars %>%
group_by_dt(cols = c("cyl","am")) %>%
group_exe_dt(
summarise_dt(mpg_sum = sum(mpg))
)
13 group_dt :分组计算
#--分组提取每个分组前三行
iris %>% group_dt(by = Species,slice_dt(1:3))
#--分组求取每个组中的最大值,保留其他列
iris %>% group_dt(Species,filter_dt(Sepal.Length == max(Sepal.Length)))
#--分组统计求取最大值,只有统计的这一列
iris %>% group_dt(Species,summarise_dt(new = max(Sepal.Length)))
# 添加一列,并分组求取这一列的和
iris %>% group_dt(Species,
mutate_dt(max= max(Sepal.Length)) %>%
summarise_dt(sum=sum(max)))
# .SD 函数可以直接使用
# 提取每个分组第一行和最后一行
iris %>%group_dt(
by = Species,
rbind(.SD[1],.SD[.N])
)
#' #summarise_dth函数内置了by参数,这样就可以直接在函数内部分组了
mtcars %>%
summarise_dt(
disp = mean(disp),
hp = mean(hp),
by = cyl
)
# z或者使用group函数分组
mtcars %>%
group_dt(by =.(vs,am),
summarise_dt(avg = mean(mpg)))
# data.table中的.()函数在这里同样等价为list()
mtcars %>%
group_dt(by =list(vs,am),
summarise_dt(avg = mean(mpg)))
# mutate_dt添加一列,mean函数计算均值,显然不够两行,这里循环补齐。
df <- data.table(x = 1:2, y = 3:4, z = 4:5)
df
df %>% mutate_dt(m = mean(c(x, y, z)))
#-等价
df %>% rowwise_dt(
mutate_dt(m = mean(c(x, y, z)))
)
14 in_dt: 综合函数
按照分组进行排序,然后提取排序好的数据行,十分有用。对于微生物组数据。
iris %>% as_dt()
#--排序,分组提取第一个数据
iris %>% in_dt(order(-Sepal.Length),.SD[1],by=Species)
15 lead_dt:快速创建向量
lead_dt(1:5)
lag_dt(1:5)
lead_dt(1:5,2)
lead_dt(1:5,n = 2,fill = 0)
16 _join_dt:最重要的一组函数,合并数据框
#--构造data.table对象
workers = fread("
name company
Nick Acme
John Ajax
Daniela Ajax
")
#-构建另一个data.table对象
positions = fread("
name position
John designer
Daniela engineer
Cathie manager
")
# ?inner_join
#--合并数据框
#--共有合并
workers %>% inner_join_dt(positions)
#-保留左侧行
workers %>% left_join_dt(positions)
#保留右侧行
workers %>% right_join_dt(positions)
#-保留全部行
workers %>% full_join_dt(positions)
# 输出左侧数据框独有行
workers %>% anti_join_dt(positions)
#-输出左侧数据库共有行
workers %>% semi_join_dt(positions)
# 通过by参数指定合并的行列名
workers %>% left_join_dt(positions, by = "name")
# 重命名
positions2 = setNames(positions, c("worker", "position")) # rename first column in 'positions'
#--如果两数据库不同名需要合并,使用等号匹配列名
workers %>% inner_join_dt(positions2, by = c("name" = "worker"))
# 等价
workers %>% ijoin(positions2,by = "name==worker")
#-两种合并方式相同
x= data.table(a=1:5,a1 = 2:6,b=11:15)
y= data.table(a=c(1:4,6), a1 = c(1,2,4,5,1),c=c(101:104,106))
#默认相同的合并
merge(x,y,all = TRUE) -> a
#--按照两列合并
fjoin(x,y,by = c("a","a1")) -> b
data.table::setcolorder(a,names(b))
fsetequal(a,b)
16 longer_dt:数据宽边长
## 构造数据
stocks = data.frame(
time = as.Date('2009-01-01') + 0:9,
X = rnorm(10, 0, 1),
Y = rnorm(10, 0, 2),
Z = rnorm(10, 0, 4)
)
stocks
# 数据宽变长
stocks %>%
longer_dt(time)
#--部分即可匹配
stocks %>%
longer_dt("ti")
#-这部分找不到数据集"billboard",所以没有学习运行
# library(tidyr)
# # install.packages("billboard")
# library("billboard")
# data(billboard)
#
#
# billboard %>%
# longer_dt(
# -"wk",
# name = "week",
# value = "rank",
# na.rm = TRUE
# )
#
# billboard
# # or use:
# billboard %>%
# longer_dt(
# artist,track,date.entered,
# name = "week",
# value = "rank",
# na.rm = TRUE
# )
# # or use:
# billboard %>%
# longer_dt(
# 1:3,
# name = "week",
# value = "rank",
# na.rm = TRUE
# )
17 df_mat:矩阵和列表快速转化
这对于网络分析和相关分析十分有用。
mm = matrix(c(1:8,NA),ncol = 3,dimnames = list(letters[1:3],LETTERS[1:3]))
mm
#--矩阵边列表
tdf = mat_df(mm)
tdf
#--列表边矩阵
mat = df_mat(tdf,row,col,value)
mat
setequal(mm,mat)
tdf %>%
setNames(c("A","B","C")) %>%
df_mat(A,B,C)
18 mutate_dt :添加新的数据列
#--添加新的列,添加到原来列后面
iris %>% mutate_dt(one = 1,Sepal.Length = Sepal.Length + 1)
#---不要原来的数据了
iris %>% transmute_dt(one = 1,Sepal.Length = Sepal.Length + 1)
# `.GRP`:分组标签添加,这些特殊符号一定要注意
iris %>% mutate_dt(id = 1:.N,grp = .GRP,by = Species)
18 mutate_when;mutate_vars,数据框整理添加新列
按照条件添加新的列,按照条件对多列进行操作
iris[3:8,]
#-条件添加数据
iris[3:8,] %>%
mutate_when(Petal.Width == .2,
one = 1,Sepal.Length=2)
#--对符合条件的列标准化
iris %>% mutate_vars("Pe",scale)
#--对全部为数值的数据列进行标准化
iris %>% mutate_vars(is.numeric,scale)
#--非因子列进行标准化
iris %>% mutate_vars(-is.factor,scale)
#前两列标准化
iris %>% mutate_vars(1:2,scale)
#--将全部数据列转化为字符串
iris %>% mutate_vars(.func = as.character)
第二篇章
19 nest_dt:数据框与列表的变换
library(tidyfst)
#-按照分组拆分数据框
a = mtcars %>% nest_dt(cyl)
#查看数据类型
# str(a)
#-查看数据list
# a[[2]]
mtcars %>% nest_dt("cyl")
mtcars %>% nest_dt(cyl,vs)
mtcars %>% nest_dt(vs:am)
mtcars %>% nest_dt("cyl|vs")
mtcars %>% nest_dt(c("cyl","vs"))
# 两列拆分数据框,称为两组列表
a = iris %>% nest_dt(mcols = list(petal="^Pe",sepal="^Se"))
# #-第二组列表查看
# a[[3]]
#--复原。ndt为需要指定的列
mtcars %>% nest_dt("cyl|vs") %>%
unnest_dt(ndt)
mtcars %>% nest_dt("cyl|vs") %>%
unnest_dt("ndt")
#---列表和数据库可以一起构建
df <- data.table(
a = list(c("a", "b"), "c"),
b = list(c(TRUE,TRUE),FALSE),
c = list(3,c(1,2)),
d = c(11, 22)
)
# str(df)
20 nth:从向量中提取值
通过编号提取目标的值,这里指定了负数为倒序,从后往前的位置。
x = 1:10
nth(x, 1)
nth(x, 5)
nth(x, -2)
21 pull_dt 从向量中根据位置提取元素
mtcars %>% pull_dt(2)
mtcars %>% pull_dt(cyl)
mtcars %>% pull_dt("cyl")
22 pull_dt:提取数据框单一变量(转化为向量形式)
那么你想提取两列行不行,当然不行!
#-这三种方式提取结果是相同的
mtcars %>% pull_dt(2)
mtcars %>% pull_dt(cyl)
mtcars %>% pull_dt("cyl")
#-查看名称
colnames(mtcars)
23 relocate_dt:对列进行排序
df <- data.table(a = 1, b = 1, c = 1, d = "a", e = "a", f = "a")
df
df %>% relocate_dt(f)
df %>% relocate_dt(a,how = "last")
df %>% relocate_dt(is.character)
df %>% relocate_dt(is.numeric, how = "last")
df %>% relocate_dt("[aeiou]")
df %>% relocate_dt(a, how = "after",where = f)
df %>% relocate_dt(f, how = "before",where = a)
df %>% relocate_dt(f, how = "before",where = c)
df %>% relocate_dt(f, how = "after",where = c)
df2 <- data.table(a = 1, b = "a", c = 1, d = "a")
df2 %>% relocate_dt(is.numeric,
how = "after",
where = is.character)
df2 %>% relocate_dt(is.numeric,
how="before",
where = is.character)
24 relocate_d:对列名进行位置调整
这个工具十分强大,对于微生物领域也将十分有用。
df <- data.table(a = 1, b = 1, c = 1, d = "a", e = "a", f = "a")
df
#-将f列提高第一列
df %>% relocate_dt(f)
#将a列提到最后一列
df %>% relocate_dt(a,how = "last")
#将字符串列已移到前面
df %>% relocate_dt(is.character)
#将数值型变量列移到后面
df %>% relocate_dt(is.numeric, how = "last")
#--将列名按照顺序排列
df %>% relocate_dt("[aeiou]")
#-将a排列在f后面
df %>% relocate_dt(a, how = "after",where = f)
#-将f排列到a前面
df %>% relocate_dt(f, how = "before",where = a)
#将f排列到c前面
df %>% relocate_dt(f, how = "before",where = c)
df %>% relocate_dt(f, how = "after",where = c)
df2 <- data.table(a = 1, b = "a", c = 1, d = "a")
#-将数值型变量排列到字符串后面
df2 %>% relocate_dt(is.numeric,
how = "after",
where = is.character)
df2 %>% relocate_dt(is.numeric,
how="before",
where = is.character)
25 rename_dt:对数据列进行改名
#-改名,使用等号来指定旧名和新名
iris %>%
rename_dt(sl = Sepal.Length,sw = Sepal.Width) %>%
head()
26 replace_dt:对一列内容替换(条件)
iris %>% mutate_vars(is.factor,as.character) -> new_iris
#-指定列,替换内容,字符串替换
new_iris %>%
replace_dt(Species, from = "setosa",to = "SS")
new_iris %>%
replace_dt(Species,from = c("setosa","virginica"),to = "sv")
#-数值替换
new_iris %>%
replace_dt(Petal.Width, from = .2,to = 2)
new_iris %>%
replace_dt(from = .2,to = NA)
#-添加基本运算
new_iris %>%
replace_dt(is.numeric, from = function(x) x > 3, to = 9999 )
27 rn_col:对首列和列名操作(位置互换)
#--将列名提取到第一列
mtcars %>% rn_col()
#列名提取到第一列,并改名为rn
mtcars %>% rn_col("rn")
#-赋值给信数据框
mtcars %>% rn_col() -> new_mtcars
#--改回去,将第一列放回到列名
new_mtcars %>% col_rn() -> old_mtcars
old_mtcars
setequal(mtcars,old_mtcars)
28 sample_n_dt:行随机抽样
#--抽取行
sample_n_dt(mtcars, 10)
#--可重复抽取行
sample_n_dt(mtcars, 50, replace = TRUE)
#-按照百分比抽取行
sample_frac_dt(mtcars, 0.1)
# 设置可重复,就可以抽取比原来总体还要大的数据行。
sample_frac_dt(mtcars, 1.5, replace = TRUE)
#--换种写法
sample_dt(mtcars,n=10)
sample_dt(mtcars,prop = 0.1)
29 select_dt:列选择工具箱
#---select是一个大函数,许多功能非常实用
#--挑选一列
iris %>% select_dt(Species)
#-挑选两列
iris %>% select_dt(Sepal.Length,Sepal.Width)
#-挑选这两列之间的全部列
iris %>% select_dt(Sepal.Length:Petal.Length)
#去除某一列
iris %>% select_dt(-Sepal.Length)
#--去除两列
iris %>% select_dt(-Sepal.Length,-Petal.Length)
#去除这两列之前额全部列
iris %>% select_dt(-(Sepal.Length:Petal.Length))
#--可以使用字符串形式指定,效果相同
iris %>% select_dt(c("Sepal.Length","Sepal.Width"))
iris %>% select_dt(-c("Sepal.Length","Sepal.Width"))
#--可以使用列编号指定,效果相同
iris %>% select_dt(1)
iris %>% select_dt(-1)
iris %>% select_dt(1:3)
iris %>% select_dt(-(1:3))
iris %>% select_dt(1,3)
#--支持部分匹配和逻辑运算符
iris %>% select_dt("Pe")
iris %>% select_dt(-"Se")
iris %>% select_dt(!"Se")
?select_dt
iris %>% select_dt("Pe",negate = TRUE)
iris %>% select_dt("Pe|Sp")
iris %>% select_dt(cols = 2:3)
#--添加参数negate返回不匹配的列
iris %>% select_dt(cols = 2:3,negate = TRUE)
iris %>% select_dt(cols = c("Sepal.Length","Sepal.Width"))
iris %>% select_dt(cols = names(iris)[2:3])
iris %>% select_dt(is.factor)
iris %>% select_dt(-is.factor)
iris %>% select_dt(!is.factor)
# 这个函数提供的选择十分灵活,即使同时包含多种类型都可以选择
select_mix(iris, Species,"Sepal.Length")
select_mix(iris,1:2,is.factor)
select_mix(iris,Sepal.Length,is.numeric)
# rm.dup:是否删除重复列
select_mix(iris,Sepal.Length,is.numeric,rm.dup = FALSE)
30 separate_dt:字符串拆分
对于物种注释数据十分有用
#--字符串拆分
df <- data.frame(x = c(NA, "a.b", "a.d", "b.c"))
df
df %>% separate_dt(x, c("A", "B"))
# equals to
df %>% separate_dt("x", c("A", "B"))
31 slice_dt :对行切几行
iris %>% slice_dt(1:3)
iris %>% slice_dt(1,3)
iris %>% slice_dt(c(1,3))
31 summarise_dt:数据框统计
#--计算一列均值
iris %>% summarise_dt(avg = mean(Sepal.Length))
#by参数,按照分组计算均值
iris %>% summarise_dt(avg = mean(Sepal.Length),by = Species)
#-多组分组,计算均值
mtcars %>% summarise_dt(avg = mean(hp),by = .(cyl,vs))
# 统计数量
mtcars %>% summarise_dt(cyl_n = .N, by = .(cyl, vs)) # `.`` is short for list
#--统计数值型变量最小值
iris %>% summarise_vars(is.numeric,min)
#等同于上面
iris %>% summarise_vars(-is.factor,min)
#统计前四行最小值
iris %>% summarise_vars(1:4,min)
#-列全部转化为字符串
iris %>% summarise_vars(.func = as.character)
#-按照分组对数值型列求取最小值
iris %>% summarise_vars(is.numeric,min,by ="Species")
#-按照两列求取,可以使用逗号分隔,外加引号括起来。
mtcars %>% summarise_vars(is.numeric,mean,by = "vs,am")
32 sys_time_print:统计运行时间
sys_time_print(Sys.sleep(1))
a = iris
#--由于idyfst总是处理大数据,所以对于时间要求很严格,这里提供了函数用于统计时间
sys_time_print({
res = iris %>%
mutate_dt(one = 1)
})
res
33 top_n_dt :提取前几行(条件)。
#--提取前十行数据
iris %>% top_n_dt(10,Sepal.Length)
#-去除前十行数据
iris %>% top_n_dt(-10,Sepal.Length)
iris %>% top_frac_dt(.1,Sepal.Length)
iris %>% top_frac_dt(-.1,Sepal.Length)
# For `top_dt`, you can use both modes above
iris %>% top_dt(Sepal.Length,n = 10)
iris %>% top_dt(Sepal.Length,prop = .1)
34 t_dt :提供数据框的转置
?t_dt
t_dt(iris)
t_dt(mtcars)
35 uncount_dt :提供频数转化我单个统计量
df <- data.table(x = c("a", "b"), n = c(1, 2))
df
#-将频数转化为单个统计数量
uncount_dt(df, n)
#-F设置在统计数量后添加每个数量的频数
uncount_dt(df,n,FALSE)
36 unite_dt:提供行的合并处理
这对于宏基因组处理物种注释数据很有帮助
df <- expand.grid(x = c("a", NA), y = c("b", NA))
df
# Treat missing value as character "NA"
df %>% unite_dt("z", x:y, remove = FALSE)
# T空缺值处理,只要有,边全部按照NA处理
df %>% unite_dt("z", x:y, na.rm = TRUE, remove = FALSE)
#默认空缺值保留,都保留
df %>%
unite_dt("xy", x:y)
# 将全部的行都合并起来
iris %>% unite_dt("merged_name","")
37 utf8_encoding:使用utf8编码数据框
这对于中文很有帮助
utf8_encoding(iris)
38 wider_dt:数据长变宽
#-构造转化为长数据
stocks = data.frame(
time = as.Date('2009-01-01') + 0:9,
X = rnorm(10, 0, 1),
Y = rnorm(10, 0, 2),
Z = rnorm(10, 0, 4)
) %>%
longer_dt(time) -> longer_stocks
longer_stocks
#-长数据转宽数据
longer_stocks %>%
wider_dt("time",
name = "name",
value = "value")
#构造填充数据,并转换
longer_stocks %>%
mutate_dt(one = 1) %>%
wider_dt("time",
name = "name",
value = "one")
## using "fun" parameter for aggregation
DT <- data.table(v1 = rep(1:2, each = 6),
v2 = rep(rep(1:3, 2), each = 2),
v3 = rep(1:2, 6),
v4 = rnorm(6))
DT
## 两列作为标签,然后计算总和
DT %>%
wider_dt(v1,v2,
value = "v4",
name = ".",
fun = sum)
#--计算最小值
DT %>%
wider_dt(v1,v2,
value = "v4",
name = ".",
fun = min)
后记
到此,tidyfst数据处理我就全部学习完成了,这部分也添加上的中文标注,相比是十分容易理解的,当然有5%的代码我还不是很清楚,这个就要读源代码或者继续看作者文档了。
完成后,我立刻就想到由于在我开始学习R的时候dplyr包并不是很流行,也没有带我学习这种工具,所以我对数据框处理的方式有plyr,apply,还有perl,等影子。大量操作使用for循环此时为了处理大数据,我必须全部扒皮,将习惯修改为dplyr和tidyr的易读类型。
学习使用的是示例数据,需要对实际的数据进行测试运行,这里在下一篇文档中我进行测试验证。希望不要让我失望。
数据分析圈 - 知乎www.zhihu.com