写在前面

本包开发者黄天元;

首先我对tidyfst进行了一套完整的学习,因为这里面的函数并不多,满打满计算,也就38个。

随着扩增子的平稳,我逐渐转入宏基因组,软件更多,平台跨度更大,R语言显示出来很多弊端:

  • 数据处理过程不够快,无法快速读入,输出;

近年来出现了许多工具解决这个问题,本着适合之前的习惯,我想通过data.table和tadyfst解决这个问题。希望我这一路都是顺畅的。结果会如我所料吗?

tidyfst包(fstpackage/fst)

它的优势:

1、快速读写数据框

2、文件压缩,保存数据框能够给文件进行压缩,这就节省了大数据转移的时间(从硬盘放到电脑或者上传服务器)。压缩的比率是非常感人的,有一个参数可以控制压缩比例,我一般设置到最大。我问过原作者,他跟我解释过,压缩比例一共是100个等级,不压缩的时候读写是最快的,但是使劲压缩,读写依然非常快!亲测确实如此,所以我每次都用最大等级的压缩,并包装了他的函数,把默认压缩率改为100(默认值为50)。

测试 fst格式操作

为什么我要测试这个呢?因为fst更快。

构造一个巨大的数据框,代码参考hopeR。

library(tidyfst)# 构造一个1亿行,4列的数据框
nr_of_rows <- 1e8df <- 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_fstsys_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_fsthead(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
)dfdf %>% 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)
matsetequal(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_dtt_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_stockslonger_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的易读类型。

学习使用的是示例数据,需要对实际的数据进行测试运行,这里在下一篇文档中我进行测试验证。希望不要让我失望。

猜你喜欢

10000+:菌群分析 宝宝与猫狗 梅毒狂想曲 提DNA发Nature Cell专刊 肠道指挥大脑

系列教程:微生物组入门 Biostar 微生物组  宏基因组

专业技能:学术图表 高分文章 生信宝典 不可或缺的人

一文读懂:宏基因组 寄生虫益处 进化树

必备技能:提问 搜索  Endnote

文献阅读 热心肠 SemanticScholar Geenmedical

扩增子分析:图表解读 分析流程 统计绘图

16S功能预测   PICRUSt  FAPROTAX  Bugbase Tax4Fun

在线工具:16S预测培养基 生信绘图

科研经验:云笔记  云协作 公众号

编程模板: Shell  R Perl

生物科普:  肠道细菌 人体上的生命 生命大跃进  细胞暗战 人体奥秘

写在后面

为鼓励读者交流、快速解决科研困难,我们建立了“宏基因组”专业讨论群,目前己有国内外5000+ 一线科研人员加入。参与讨论,获得专业解答,欢迎分享此文至朋友圈,并扫码加主编好友带你入群,务必备注“姓名-单位-研究方向-职称/年级”。PI请明示身份,另有海内外微生物相关PI群供大佬合作交流。技术问题寻求帮助,首先阅读《如何优雅的提问》学习解决问题思路,仍未解决群内讨论,问题不私聊,帮助同行。

学习16S扩增子、宏基因组科研思路和分析实战,关注“宏基因组”

点击阅读原文,跳转最新文章目录阅读

R最快且比dplyr最高效的大数据处理R包:tidyfst相关推荐

  1. R count函数_R最快且比dplyr最高效的大数据处理R包:tidyfst

    R最快且比dplyr最高效的大数据处理R包:tidyfst​mp.weixin.qq.com 写在前面 本包开发者黄天元: 首先我对tidyfst进行了一套完整的学习,因为这里面的函数并不多,满打满计 ...

  2. R语言与金融大数据处理——基础篇(代码)

    # 加百力咨询: <R语言与金融大数据处理> - <基础篇> (v1.0) # 最后修改时间:2014-04-23(17.3)# 加百力咨询: <R语言与金融大数据处理& ...

  3. R语言sys方法:sys.timezone函数返回当前系统时区的名称、system.File函数查找系统文件或者安装包的文件路径(例如查看R Base可安装路径、dplyr包的安装路径)

    R语言sys方法:sys.timezone函数返回当前系统时区的名称.system.File函数查找系统文件或者安装包的文件路径(例如查看R Base可安装路径.dplyr包的安装路径) 目录

  4. R删除数据列基于dplyr包

    R删除数据列基于dplyr包 目录 R删除数据列基于dplyr包 按列名称移除数据列 删除列表中的列 移除范围内的列

  5. R行数据过滤基于dplyr包filter函数

    R行数据过滤基于dplyr包filter函数 目录 R行数据过滤基于dplyr包filter函数 筛选等于某个值的行 使用与操作筛选行

  6. 40W-100W系列PD快充IC方案,AH6680,高效简洁的升降压芯片

    PD40W45W50W55W65W100W移动电源大功率芯片 40W-100W系列PD快充IC方案,AH6680,高效简洁的升降压芯片 PD40W45W50W65W大功率充电芯片 宽电压输入3.6 V ...

  7. R语言中的countif——dplyr包中的filter函数和nrow

    今天一早上起来又扑到R上面写笨人的matlab课作业(悲),脑壳一整个晕晕--这份作业是我用R语言从CHIP数据库提取数据,做前期数据处理和变量计算,之后给同组的建模的同学,让她用matlab建模. ...

  8. R数据分析|可视化|dplyr|Kaggle奥运会数据集(一)

    R数据分析|可视化|dplyr|Kaggle奥运会数据集(一) 研究1896年至2016年奥运会运动员的数据集,主要指标有身高.体重.年龄.国籍.参与项目.是否获得金/银/铜牌.通过运用R软件对数据作 ...

  9. 最绿色最高效,用win+r启动常用程序和文档

    最绿色最高效,用win+r启动常用程序和文档 作者: 善用佳软 日期: 2010-10-01 分类: 系统工具 标签: quick-launch 真正的高手,是普通招式发挥出大威力,是根据情况选用最合 ...

最新文章

  1. 不用在读长和准确性之间做选择题,PacBio发表新方法
  2. FreeMarker中文帮助手册API文档,基础入门学习文档
  3. BOOL,int,float,指针变量与零值比较的if语句
  4. Shell脚本中的函数、数组
  5. html登录注册的正则,怎么用html5编写用户注册验证程序
  6. 团队作业(五):冲刺总结
  7. 自然语言处理实践Task6
  8. 长城 宽带 +招商银行专业版
  9. Android studio 2.3版本出现的问题: Please select at least one of the signature versions to use
  10. 解决excel导出大数字溢出或者被科学计数法格式化
  11. spark中的广播变量与累加器
  12. Python 列表与元组
  13. LOTO 示波器 两种电流探头的对比实测
  14. Spark视频王家林大神 第7课: Spark机器学习内幕剖析
  15. 【计算机组成】内存和芯片存储容量问题
  16. html文件超链接打不开,Excel中出现超链接打不开的解决方法
  17. jquery仿钉钉流程图制作。
  18. Ai-WB2模组基于TCP的MQTT连接服务器使用示例
  19. 为什么电脑运行越来越慢?解决方法又是什么呢?
  20. 实战 - 学成在线项目

热门文章

  1. 女程序员婚前买房给父母住,婚后要求男程序员一起还房贷!男程序员怀疑婚姻!...
  2. 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  3. GitHub年度报告:JS第一,Python第二,Java第三
  4. 14年阿里巴巴管理经验总监:教你管理7步心法(演讲全文)
  5. 7个珍藏多年的网站,颠覆你的想象,值得收藏起来!
  6. mysql 无限长度,如何将varchar设置为无限长度?
  7. flex 单独一行_Flex布局从了解到使用只需5min
  8. easyui动态增加datagrid列_多工作表动态合并,其实很简单
  9. 直接插入排序算法实现思想个人理解
  10. C++中无符号数与有符号数的转换