提问人:chriswang123456 提问时间:6/29/2021 最后编辑:chriswang123456 更新时间:6/29/2021 访问量:130
使用 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 循环创建单独的 DataFrame 对象,其中只有日期和实际值将用于为每个对象创建时间序列。如何将这些对象的值放入单个 DataFrame 或 dfs 列表中?(第二个问题)
答:
0赞
akrun
6/29/2021
#1
我们可以用来返回对象名称子集上的对象值。匹配以“df”开头的对象名称和任何字母数字字符mget
ls
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)
评论
0赞
chriswang123456
6/29/2021
哇,我从来不知道我能做这样的事情。Df.1,df.2 等将添加 20+ 列到每个列,然后内部连接并稍后导出。无论如何,我都可以在我的环境中创建这些对象的列表,因为我以后可以根据需要修改它们吗?
0赞
akrun
6/29/2021
@chriswang123这些物体已经在您的环境中,这就是作品的原因mget
0赞
akrun
6/29/2021
@chriswang123 你是说你的环境与全局环境不同吗?
0赞
akrun
6/29/2021
@chriswang123我不确定更新是否是您想要的。请检查
0赞
chriswang123456
6/29/2021
对不起,如果我没有很好地解释事情。基本上说我有 df.1、df.2 等。我最终会为每个单独的 df 添加值。例如。。。DF.1$ARIMA <- C(1,2,3,5) 和 DF.2$ARIMA 也是如此......等等等等。我希望它们进入 dfs 列表,因此我的list_df代码。我想要一种更简单的方法来创建我的list_df,而不是手动输入 list(和我所有的 dfs 名称)
评论
split(df[1:2], df[3])