首页 文章

在多个向量/列表上子集数据帧并为R中的每个子集组合应用函数[重复]

提问于
浏览
0

这个问题在这里已有答案:

我有一个数据框(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

有一个更好的方法吗?要么更好的循环或一些sapply或lapply方法?我不确定如何处理这个,因为3个向量有不同的长度 .

1 回答

  • 0

    group_bymutate 会做到这一点!

    library(dplyr)
    
    data <- data_frame(
      Date = c("7/16","8/16","8/16","8/16","9/16","9/16"),
      Region = c("NW", "NW", "SW", "SW", "NW", "NW"),
      Company = c("ABC", "ABC", "DEF", "DEF", "ABC", "DEF"),
      Item = c("Phone", "Phone", "Food", "Food", "Tools", "Tools"),
      Price = c(200, 200, 100, 50, 100, 50)
      )
    
    data %>% 
      group_by(Region, Company, Item) %>% 
      mutate(Price = Price + mean(Price))
    

    输出如下:

    Source: local data frame [6 x 5]
    Groups: Region, Company, Item [4]
       Date Region Company  Item Price
      <chr>  <chr>   <chr> <chr> <dbl>
    1  7/16     NW     ABC Phone   400
    2  8/16     NW     ABC Phone   400
    3  8/16     SW     DEF  Food   175
    4  8/16     SW     DEF  Food   125
    5  9/16     NW     ABC Tools   200
    6  9/16     NW     DEF Tools   100
    

相关问题