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

4597752ce529152fb7592cb15db18714.png
R最快且比dplyr最高效的大数据处理R包:tidyfst​mp.weixin.qq.com
ef524072c02cdab2c52704801fd50e02.png

写在前面

本包开发者黄天元;

首先我对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
9bec128c1e832af4c50e461a58d0610e.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值