首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R组外操作

R组外操作
EN

Stack Overflow用户
提问于 2016-12-07 09:41:43
回答 2查看 156关注 0票数 1

我的问题是计算每个时期不同产品的价格差异。使用下面的样本数据

代码语言:javascript
运行
复制
product = c('A','A','A','B','B','B','C','C','C')
date = as.Date(c('2016-09-12','2016-09-19', '2016-09-26','2016-09-12','2016-09-19', '2016-09-26', '2016-09-12','2016-09-19', '2016-09-26'))
price = as.numeric(c(17, 14.7, 15, 14.69, 14.64, 14.63, 13.15, 13.15, 13.15))

df <- data.frame(product, date, price)

挑战在于分组,没有分组,对外部函数的简单调用就可以完成任务。

代码语言:javascript
运行
复制
melt(outer(df$price, df$price, "-"))

但是,将其与dplyr中的transmute函数相结合,将导致一条奇怪的错误消息:" error:“。在线评论指出,这可能是由于包中的错误所致。

因此,我想知道是否有人对另一种办法有明确的建议。

理想情况下,我正在寻找输出

代码语言:javascript
运行
复制
Var1 Var2 Date          value
A    A    '2016-09-12'  0.00
A    B    '2016-09-12'  2.31
A    C    '2016-09-12'  3.85
B    A    '2016-09-12' -2.31
B    B    '2016-09-12'  0.00
B    C    '2016-09-12'  1.54
C    A    '2016-09-12' -3.85
C    B    '2016-09-12' -1.54
C    C    '2016-09-12'  0.00
A    A    '2016-09-19'  0.00
A    B    '2016-09-19'  0.06
A    C    '2016-09-19'  1.55

等等,感谢这会留下一些多余的配对,但这会让生活更轻松。

谢谢大家的关注。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-07 09:47:32

通常,如果数据转换不适用于mutate/transform,则可以尝试do

代码语言:javascript
运行
复制
> library(dplyr)
> df %>% 
   group_by(date) %>% 
   do(reshape2::melt(outer(.$price, .$price, "-")))

Source: local data frame [27 x 4]
Groups: date [3]

         date  Var1  Var2 value
       (date) (int) (int) (dbl)
1  2016-09-12     1     1  0.00
2  2016-09-12     2     1 -2.31
3  2016-09-12     3     1 -3.85
4  2016-09-12     1     2  2.31
5  2016-09-12     2     2  0.00
6  2016-09-12     3     2 -1.54
7  2016-09-12     1     3  3.85
8  2016-09-12     2     3  1.54
9  2016-09-12     3     3  0.00
10 2016-09-19     1     1  0.00
..        ...   ...   ...   ...
票数 4
EN

Stack Overflow用户

发布于 2016-12-07 09:49:53

我们可以使用data.table

代码语言:javascript
运行
复制
library(data.table)
res <- setDT(df)[, melt(outer(price, price, "-")) , by = date]
res[, c("Var1", "Var2") := lapply(.SD, function(x)
                unique(df$product)[x]),.SDcols = Var1:Var2]

head(res)
#         date Var1 Var2 value
#1: 2016-09-12    A    A  0.00
#2: 2016-09-12    B    A -2.31
#3: 2016-09-12    C    A -3.85
#4: 2016-09-12    A    B  2.31
#5: 2016-09-12    B    B  0.00
#6: 2016-09-12    C    B -1.54

使用tidyr/dplyr的选项

代码语言:javascript
运行
复制
library(tidyr)
library(dplyr)
df %>%
   group_by(date) %>% 
   expand(price, price2=price) %>% 
   mutate(value = price-price2)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41014020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档