前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言中list的批量操作

R语言中list的批量操作

作者头像
一粒沙
发布2022-06-07 18:11:14
1.8K0
发布2022-06-07 18:11:14
举报
文章被收录于专栏:R语言交流中心R语言交流中心

这个包的神奇之处在于能批量处理问题,例如,可以读取多个文件,跑模型的时候,可以批量输入多个参数,并把结果合并起来做比较

代码语言:javascript
复制
install.packages("purrr")

接下来我们通过实例来看下此包的具体使用:

1. 数据分割

代码语言:javascript
复制
## 向量分割
require(stats); require(graphics)
n <- 10; nn <- 100
g <- factor(round(n * runif(n * nn)))
x <- rnorm(n * nn) + sqrt(as.numeric(g))
xg <- split(x, g)
boxplot(xg, col = "lavender", notch = TRUE, varwidth = TRUE)
代码语言:javascript
复制
##数据矩阵分割
mtcars %>% split(.$cyl)

2. list数据的向量化

代码语言:javascript
复制
###拆分list
x <- rerun(2, sample(4))
x %>% flatten()


##去列表化,转为向量
x <- rerun(2, sample(4))
x %>% flatten_int() ##数值型
x %>%flatten_chr() ##字符串型


##多list的横向合并,需要行名一致


x <- rerun(2, sample(4))
x[[1]]=as.data.frame(x[[1]])
x[[2]]=as.data.frame(x[[2]])
x%>%flatten_dfc()


##多list横向合并,需要列名都不一样
x%>%flatten_dfr()


##读取列表中的同一个名称的子列表数据
pluck(x,1)


##保留满足条件的子列表数据
rep(10, 10) %>%
  map(sample, 5) %>%
  keep(function(x) mean(x) > 6) ##keep提供具体的操作函数


##删除满足条件的子列表数据
rep(10, 10) %>%
  map(sample, 5) %>%
  discard(function(x) mean(x) > 6)


##将各子列表的值相互交叉处合并,形成一个新的子列表
data <- list(
  id = c("John", "Jane"),
  greeting = c("Hello.", "Bonjour."),
  sep = c("! ", "... ")
)
data %>%
  cross() %>%
  map(lift(paste))
代码语言:javascript
复制
##交叉后直接转化为数据框
data %>% cross_df()
代码语言:javascript
复制
##寻找第一个符合条件的值或者位置
is_even <- function(x) x %% 2 == 0
3:10 %>% detect(is_even)##值
3:10 %>% detect_index(is_even)##index
##查询这个list中是否存在不满足条件的子列表,如果有,直接返回false
y <- list(0:10, 5.5)
y %>% every(is.numeric)


##查看list的深度
x <- list(
  list(),
  list(list()),
  list(list(list(1)))
)
vec_depth(x)
x %>% map_int(vec_depth)##每个子列表的深度计算
##判断子列表数据是否存在,完整子列表值的匹配,返回TRUE/FALSE
x <- list(1:10, 5, 9.9)
x %>% has_element(1:10)
## list中值的添加和修改
x <- list(x = 1:10, y = 4, z = list(a = 1, b = 2))
str(list_modify(x, a = 1))##添加
str(list_modify(x, z = 5))##修改

2. 函数参数载入

代码语言:javascript
复制
##数据参数引入
invoke(runif, list(n = 10))##相当于runif(10)
##函数参数引入
invoke(paste, list("01a", "01b"), sep = "-")
#
list("01a", "01b") %>% invoke(paste, ., sep = "-")


####函数的转变,此函数可以避免发生错误导致函数终止。
safe_log <- safely(log)
safe_log(10)
safe_log("a")

3. 子列表的批量操作

代码语言:javascript
复制
##基础函数操作
1:10 %>%
  map(rnorm, n = 10)
##自定义函数
1:10 %>%
  map(function(x) rnorm(10, x))
##基于公式的操作
1:10 %>%
  map(~ rnorm(10, .x))
##返回数据框
1:10 %>%
  Map_dfc(rnorm, n = 10)
代码语言:javascript
复制
##判断需要操作的子列表中的所有值
map_if(iris, is.numeric, as.character, .else = as.integer)##is.numeric 判断子列表属性,TRUE(as.character),false(as.interger)
##直接修改子列表
mtcars %>% modify_at(c(1, 4, 5), as.character) %>% str()##将1,4,5子列表进行as.character()修改

至此,便是所有的相关功能,总的来说是一个对列表进行深入操作的综合包。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 R语言交流中心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档