【发布时间】:2017-05-08 11:22:48
【问题描述】:
我搜索了很多试图找到答案。这似乎是一个相对简单和常见的问题,我很惊讶我没有找到答案,但也许我只是没有搜索正确的关键字。
我想根据另一列中的值计算三行中某些列的加权和。如果您查看下面的虚拟表,我认为它更有意义。
INDIVIDUAL <- c("A","A","A","A","A","A","B","B","B","B","B","B")
BEHAVIOR <- c("Smell", "Dig", "Eat", "Smell", "Dig", "Eat","Smell", "Dig", "Eat","Smell", "Dig", "Eat")
FOOD <- c("a", "a", "a","b","b","b", "a", "a", "a","b","b","b")
TIME <- c(2,4,7,6,1,2,9,0,4,3,7,6)
sample <- data.frame(Individual=INDIVIDUAL, Behavior=BEHAVIOR, Food=FOOD, Time=TIME)
每个人都会花费一定的时间来闻、挖掘和吃每种食物。我想对这三个时间进行加权和求和,以使每个食品有一个总时间。闻是最轻的,吃是最重的。所以基本上我想要与每种食物互动的时间:每个FoodA的时间=(EatA)+(0.5*DigA)+(0.33*SmellA)。
在广泛浏览网页后,我能想到的最佳想法是:
sample %>%
group_by(Individual, Food) %>%
mutate(TIME = ((fullsum$BEHAVIOR == "EAT")
+(.5*(fullsum$BEHAVIOR == "DIG")
+(.33*(fullsum$BEHAVIOR == "SMELL")))))
但它不起作用,我收到此错误:mutate_impl(.data, dots) 中的错误:大小不兼容 (2195),期望为 1(组大小)或 1。
任何已回答此问题的建议或指导将不胜感激!
最终结果
我修改了 fexjoo 的建议以考虑缺失值,结果与我在 Excel 中手动计算的值相匹配,所以看起来这是赢家。可能有一种更简洁的方法可以从每一列中删除 NA,但我可以接受。
data.frame %>%
spread(BEHAVIOR, TIME) %>%
mutate(EAT = coalesce(EAT, 0)) %>%
mutate(DIG = coalesce(DIG, 0)) %>%
mutate(SMELL = coalesce(SMELL, 0)) %>%
mutate(TIME = EAT + .5*DIG + .33*SMELL)
【问题讨论】:
-
我不完全清楚你是如何计算权重的。他们是任意的吗?