【发布时间】:2018-02-25 06:07:42
【问题描述】:
我有一个数据框 (df),其中包含多个列,例如项目、公司、地区、日期、价格。我想应用一些函数或转换,例如使用下面 3 个向量的组合/分组将价格的平均值添加到每个子集的价格列,以便在应用函数之前对我的数据框进行子集化。这三个向量包含数据框中不同的项目、公司和区域,并且也有不同的长度,即比公司或区域有更多不同的项目。
数据框示例:
Date | Region | Company | Item | Price
---------------------------------------
7/16 | NW | ABC | Phone| 200
8/16 | NW | ABC | Phone| 200
8/16 | SW | DEF | Food | 100
8/16 | SW | DEF | Food | 50
9/16 | NW | ABC | Tools| 100
9/16 | NW | DEF | Tools| 50
以下 3 个向量:
item <- unique(df$item) # 3 different items
company <- unique(df$company) # 2 different companies
region <- unique(df$region) # 2 regions
我正在考虑运行一个嵌套的 for 循环并在循环中应用一个函数。这似乎真的很低效,最重要的是我不确定我是否做得正确。
我想象的 for 循环会是这样的......
for (i in seq_along(item))
{
for (j in seq_along(company))
{
for (k in seq_along(region))
{
x <- df[df$item==i & df$company==j & df$region==k,]
x$Price <- x$Price + mean(x$Price)
return(x)
}
}
}
我正在寻找的输出是这样的,因为每个分组并将该组的平均价格添加到 df 的价格列中:
Date | Region | Company | Item | Price
---------------------------------------
7/16 | NW | ABC | Phone| 400
8/16 | NW | ABC | Phone| 400
8/16 | SW | DEF | Food | 175
8/16 | SW | DEF | Food | 125
9/16 | NW | ABC | Tools| 200
9/16 | NW | DEF | Tools| 100
有没有更好的方法来做到这一点?更好的 for 循环还是一些 sapply 或 lapply 方法?我不确定如何处理这个问题,因为 3 个向量的长度不同。
【问题讨论】:
-
它太宽泛了。请提供您的数据框和函数的可重现示例。
-
by(df, list(df$item, df$company, df$region), somefunc)或者dplyr:;group_by(df, item, company, region) %>% ...的tidyverse。 -
添加了我想要应用的示例数据框和函数以及所需的输出!
-
for 循环在 R 中很容易避免:我建议您了解
dplyr及其group_by功能。 -
我刚刚标记的副本是关于
sum而不是mean,但逻辑是一样的。
标签: r for-loop dplyr lapply sapply