【问题标题】:Error when trying to take the difference between observations within a group尝试获取组内观察值之间的差异时出错
【发布时间】:2019-01-06 02:08:23
【问题描述】:

我有 20 个组,其中只有一个观察值在变量上为 1,我正在尝试转换其他变量,以便剩余 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?

但对象的行数相同,我不确定为什么一种语法会起作用,而只是稍微改变转换就会给我错误。

【问题讨论】:

  • 对于发布的示例,它没有显示任何错误或警告。对于原始数据中的每个“prod_id”,您可能有多个 Dich 值作为 1。在这种情况下,您可能需要重新考虑策略。试试if(any(Dich==1)) price - price[which(Dich == 1)[1]] else NA 是否有效。在这种情况下,它是每组的多个 1
  • 嘿@akrun 谢谢你的回复你有一个逻辑代码的例子我可以运行看看是否有多个 1 的 dich?我对数据的理解是这是不可能的,但是我的案例太多了,不容易浏览。
  • 只要用table(test[c('prod_id', 'Dich')])查看频率,看每个prod_id是否有超过1个1
  • 啊,是的,我确实找到了几个超过 1 的组,这对于这些数据来说真的很奇怪。我猜这些是重复的。非常感谢您的帮助!
  • 有重复但也有组有 2 个 dich 感谢使用组中的第一行减去的解决方案!如果您想将其写为答案,我将“接受”它。谢谢!

标签: r dataframe dplyr


【解决方案1】:

当某个“prod_id”有多个“Dich”值为 1 时,会发生错误。如果只有 1 个 'Dich',那么 mutate 将根据该单个 'Dich' 回收相应的 'price' 差异,但如果有多个 '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)

【讨论】:

    猜你喜欢
    • 2020-07-13
    • 2019-06-03
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    相关资源
    最近更新 更多