r - 使用 Dataframe 自动创建基于子产品的值列表
问题描述
df <- data.frame("date"=
1:4,"product"=c("B","B","A","A"),"subproduct"=c("1","2","x","y"),"actuals"=1:4)
#creates df1,df2,dfx,dfy
for(i in unique(df$subproduct)) {
nam <- paste("df", i, sep = ".")
assign(nam, df[df$subproduct==i,])
}
# CREATES LIST OF DATAFRAMES
# How do I make this so i don't have to manually type list(df.,df.,df.)
list_df <- list(df.1,df.2,df.x,df.y) %>%
lapply( function(x) x[(names(x) %in% c("date", "actuals"))])
# creates df1,df2,df3,df4 only dates and actuals, removes the other column names
for (i in 1:length(list_df)) {
assign(paste0("df", i), as.data.frame(list_df[[i]]))
}
对于第一个 for 循环,它基于唯一的子产品创建一个 df 对象。对于 list() 函数,我希望不必输入 df.1 ... df2... 等,所以如果我的数据中有 100 个唯一的子产品,我就不需要输入这个 df。 1、df.2、df.x、df.y、df.z、df.zzz、df。一遍又一遍地。我将如何最好地做到这一点(1 个问题)
最后一个 for 循环创建单独的数据框对象,只有日期和实际值将用于为每个对象创建时间序列。如何将这些对象的值放入单个数据框或 dfs 列表中?(第二个问题)
解决方案
我们可以使用mget
从 中返回对象名称子集上的对象值ls
。匹配以 'df' .` 和任何字母数字字符开头的pattern
对象名称followed by a
mget(ls(pattern = '^df\\.[[:alnum:]]+$'))
如果 OP 想在不同的环境中创建这些对象
new_env <- new.env()
list2env(mget(ls(pattern = '^df\\.[[:alnum:]]+$')), envir = new_env)
如果我们想从头开始创建新对象,请group_split
在“子产品”列上执行操作,相应地设置名称,然后创建多个对象(list2env
但不推荐)
library(dplyr)
library(stringr)
df %>%
group_split(subproduct) %>%
setNames(str_c('df.', c(1, 2, 'x', 'y'))) %>%
list2env(.GlobalEnv)
推荐阅读
- php - 在 WooCommerce 付款完成时将订单状态设置为自定义状态
- javascript - Zoom 如何能够从浏览器启动自身?
- python - 如何使用 Python 将一个字典中的值随机分配给另一个字典
- docker - Multistage docker build: stat 报告 NVIDIA 文件不存在,但它确实存在
- r - 如何在 sparklyr 中随时间计算唯一值(给出示例)?
- node.js - 如何使用单个读取流,进行多次转换并使用 Sharp 分别写入一个单独的流?
- flutter - comare 2 数组并获得 id 颤动
- c# - 为什么从 C# 代码运行此 CosmosDB SQL 查询会失败?
- r - 使用混合()运行 glmer 后 afex::all_fit() 出错
- c# - 如何以异步方法读取 URL