使用行字符串中的公司帐户更改dplyr价格*数量

时间:2018-09-18 16:23:34

标签: r dplyr

我有以下公司数据,我正在尝试连续计算价格*数量。我的问题是我似乎无法使用dplyr 访问行中的值。

x %>%
  group_by(firm) %>%
  select(Var) %>%
  mutate(revenues = price*qty)

此处mutate()函数正在寻找priceqty的列名。

任何有关如何格式化数据的建议都是很好的(我认为可能有更好的方法来处理数据)。

df <- structure(list(firm = c("firm1", "firm1", "firm1", "firm2", "firm2", 
"firm2"), Var = c("price", "qty", "package", "price", "qty", 
"package"), `2018-03` = c("199309", "10901", "210210", "25370", 
"4535", ""), `2017-03` = c("143736", "7065", "150801", "21374", 
"", "652"), `2016-03` = c("106818", "8878", "115696", "11738", 
"", "451"), `2015-03` = c("108193", "17806", "125999", "11163", 
"", "256"), `2014-03` = c("33045", "12029", "45074", "16006", 
"", "191"), `2013-03` = c("30396", "2919", "33315", "4952", "", 
"208"), `2012-03` = c("16857", "5480", "22337", "1315", "", "97"
), `2011-12` = c("3433", "8219", "11652", "559", "", ""), `2010-12` = c("3254", 
"6803", "10057", "94", "", ""), `2009-12` = c("2749", "4518", 
"7266", "38", "", "")), .Names = c("firm", "Var", "2018-03", 
"2017-03", "2016-03", "2015-03", "2014-03", "2013-03", "2012-03", 
"2011-12", "2010-12", "2009-12"), row.names = 5:10, class = "data.frame")

1 个答案:

答案 0 :(得分:4)

有两个问题:

  • 应该为数字的列实际上是字符
  • 没有Elements.GroupJoin(ElementStates, element => element.ElementID, elementState => elementState.ElementID, (element, elementState) => new { element, elementState = elementState.OrderByDescending(y => y.DateModified).FirstOrDefault() }); price列,因此无法使用mutate将这种不存在的列相乘

要解决此问题,请将名称以qty开头的列转换为数字,然后使用2gather重塑数据,以使列如下所示,而不是列每年/每月。此时,我们有spreadprice列,因此请执行计算。

qty

给予:

library(dplyr)
library(tidyr)

df %>% 
  mutate_at(vars(starts_with("2")), as.numeric) %>% 
  gather(date, value, -firm, -Var) %>% 
  spread(Var, value) %>% 
  mutate(revenue = price * qty)