【发布时间】: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 感谢使用组中的第一行减去的解决方案!如果您想将其写为答案,我将“接受”它。谢谢!