将数据(已经存在于多个数据帧中)重组为R中的不同多个数据帧

时间:2018-07-20 11:58:09

标签: r dataframe reshape

我是R的新手,在寻找一种方法来重组数据时遇到了麻烦。

目前,我有365个不同的数据框,每个数据框代表一年中的某一天。在每个数据框中都有销售点数据,因此每天在每个商店出售多少产品。每个数据帧中有四列;即ShopId,ArticleId,Date(在一个数据帧中恒定)和AmountSold。

现在,我想重组我的数据框,以便能够预测每个商店每天每种产品需要多少物品。我想通过将对应于某个商店(ShopId)的所有数据点聚类,或通过将对应于某个产品(ArticleId)的所有数据点聚类在单独的数据帧中来做到这一点。问题是我不知道该怎么做。我已经有了所有数据帧的列表,编码如下:

l.df <- lapply(ls(), function(x) if (class(get(x)) == "data.frame") get(x))

我还列出了数据框中出现的所有ArticleId: AllArticleId,以及在数据框中出现的所有ShopId的列表:AllShopId

谁能告诉我如何重组数据?

2 个答案:

答案 0 :(得分:0)

也许您可以尝试以下操作:

library(dplyr);
file_names <- dir() # Location of individual sales files
agg_df     <- do.call(rbind,lapply(file_names,read.csv)) 

# Median sale per Article ID
agg_df = agg_df %>% group_by(ArticleID) %>% 
                      mutate(mSlByArtId = median(AmountSold));

# Median sale per Shop ID
agg_df = agg_df %>% group_by(ShopID) %>% 
                      mutate(mSlByShpId = median(AmountSold));

答案 1 :(得分:0)

例如,在这里,您可以针对由mean分组的给定商店执行shopId

 dl <- list()
 dl[[1]] <- data.frame(
   shopId = rep(1:4, each = 2),
   ArticleId = c(1, 1, 3, 2, 3, 2, 1, 2),
   date = 1:8,
   AmountSoled = 5
 )

 dl[[2]] <- data.frame(
   shopId = rep(1:4, each = 2),
   ArticleId = c(2, 1, 3, 2, 4, 4, 3, 1),
   date = 1:8,
   AmountSoled = 5
 )


#  dl
# [[1]]
#   shopId ArticleId date AmountSoled
# 1      1         1    1           5
# 2      1         1    2           5
# 3      2         3    3           5
# 4      2         2    4           5
# 5      3         3    5           5
# 6      3         2    6           5
# 7      4         1    7           5
# 8      4         2    8           5
# 
# [[2]]
#   shopId ArticleId date AmountSoled
# 1      1         2    1           5
# 2      1         1    2           5
# 3      2         3    3           5
# 4      2         2    4           5
# 5      3         4    5           5
# 6      3         4    6           5
# 7      4         3    7           5
# 8      4         1    8           5


 df <- do.call(rbind, dl)
 df
#    shopId ArticleId date AmountSoled
# 1       1         1    1           5
# 2       1         1    2           5
# 3       2         3    3           5
# 4       2         2    4           5
# 5       3         3    5           5
# 6       3         2    6           5
# 7       4         1    7           5
# 8       4         2    8           5
# 9       1         2    1           5
# 10      1         1    2           5
# 11      2         3    3           5
# 12      2         2    4           5
# 13      3         4    5           5
# 14      3         4    6           5
# 15      4         3    7           5
# 16      4         1    8           5

 aggregate(df, by = list(df$shopId), mean)
#   Group.1 shopId ArticleId date AmountSoled
# 1       1      1      1.25  1.5           5
# 2       2      2      2.50  3.5           5
# 3       3      3      3.25  5.5           5
# 4       4      4      1.75  7.5           5