使用 Dataframe 自动创建基于子产品的值列表

Using Dataframe to Automatically create a list of values based off Subproduct

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 到 return 来自 ls 的对象名称子集上的对象值。 pattern 匹配以 'df'followed by a.` 和任何字母数字字符

开头的对象名称
mget(ls(pattern = '^df\.[[:alnum:]]+$'))

如果 OP 想要在不同的环境中创建这些对象

new_env <- new.env()
list2env(mget(ls(pattern = '^df\.[[:alnum:]]+$')), envir = new_env)

如果我们想从头开始创建新对象,请在 'subproduct' 列上执行 group_split,相应地设置名称,然后创建多个对象(list2env - 虽然不推荐)

library(dplyr)
library(stringr)
df %>% 
   group_split(subproduct) %>%
   setNames(str_c('df.', c(1, 2, 'x', 'y'))) %>% 
   list2env(.GlobalEnv)