R语言中list的批量操作

2022-06-07 18:11:14 浏览数 (1)

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

代码语言: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()修改

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

0 人点赞