尝试将组中的观测值之间的差异取值时出错

时间:2019-01-06 02:08:24

标签: r dataframe dplyr

我有20个小组,其中只有一个观测值在一个变量上具有一个值,并且我正尝试转换其他变量,以便其余19个观测值和我得到以下错误。

“较长的对象长度不是较短的对象长度的倍数”

library(dplyr)

test <- data.frame('prod_id'= c("shoe", "shoe", "shoe", "shoe", "shoe", 
"shoe", "boat", "boat","boat","boat","boat","boat", "ship", "ship", "ship", 
"ship", "ship", "ship"), 
           'seller_id'= c("a", "b", "c", "d", "e", "f", "a","g", "h", "r", 
"q", "b", "qe", "dj", "d3", "kk", "dn", "de"), 
           'Dich'= c(1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0),
           'price' = c(120, 20, 10, 4, 3, 4, 30, 43, 56, 88, 75, 44, 32, 
21, 44, 54, 55, 33)
            )

有趣的是,此代码有效:

test2 <- test %>% 
     group_by(prod_id) %>%
     mutate(price_diff = if(any(Dich ==1)) ((price - price[Dich == 
     1])/(price + price[Dich == 1])/2) else NA) 

这段代码

test2 <- test %>% 
     group_by(prod_id) %>%
     mutate(diff_p = if(any(Dich==1)) price - price[Dich == 1] else NA)

给我“较长的对象长度不是较短的对象长度的倍数”错误。不幸的是,我无法在示例数据中重现,所以我希望有人可以看到问题所在。

我看到了这篇文章

Longer object length is not a multiple of shorter object length?

但是对象的行数都是相同的,我不确定为什么在稍微改变转换的情况下一种语法就能工作给我错误。

1 个答案:

答案 0 :(得分:1)

当多个“ prod_id”的“ Dich”值为1时,就会发生错误。如果只有1个“ Dich”,则mutate将基于该单个“ Dich”回收对应的“价格”差额,但如果有多个“ Dich”,回收将成问题,mutate需要输出与原始数据集具有相同行数的列或新列。

因此,如果策略是获取值1的第一个出现的“ Dich”的“价格”,则可以使用which并子集第一个位置以提取“价格”

test %>% 
  group_by(prod_id) %>%
  mutate(diff_p = if(any(Dich==1)) price - price[which(Dich == 1)[1]] else NA)

或使用which.max

test %>% 
  group_by(prod_id) %>%
  mutate(diff_p = if(any(Dich==1)) price - price[which.max(Dich == 1)] else NA)

或使用match

test %>% 
  group_by(prod_id) %>%
  mutate(diff_p = if(any(Dich==1)) price - price[match(1, Dich)] else NA)