有人可以解释我对以下R功能的操作顺序是错误的吗?我希望在每一行中相乘然后对结果求和,但我得到的答案非常不同。
qqq<-data.frame(c(1,2,3),c(4,5,6))
library(dplyr)
qqq%>%sum(.[,1]*.[,2]) #returns: 53
# answer I expected: 1*4+2*5+3*6 = 32
答案 0 :(得分:3)
我们可以使用Reduce
获取rowwise产品,然后执行sum
qqq %>%
Reduce(`*`, .) %>%
sum
#[1] 32
或者正如评论中提到的@eipi一样,使用{}
也可以正常工作
qqq %>%
{.[,1]*.[,2]} %>%
sum
或do
(来自@thelatemail)
qqq %>%
do(.[1]*.[2]) %>%
sum
答案 1 :(得分:1)
我认为一个简短的例子解释了这里发生了什么,即使我不知道为什么它出现在底层代码中:
将整个数据集传递给sum
操作,然后将其与sum
操作中的表达式相加:
在最简单的示例中等同于sum(data.frame(1:3))
:
data.frame(1:3) %>% sum()
#[1] 6
然后6 + 6:
data.frame(1:3) %>% sum(.[1])
#[1] 12
现在,在输入数据集的总和之下是12,所以结果是12 + 6:
data.frame(1:3,1:3) %>% sum(.[1])
#[1] 18
将两列添加到总和中得到12 + 6 + 6:
data.frame(1:3,1:3) %>% sum(.[1],.[2])
#[1] 24
添加乘法得到12 +和(1:3 * 1:3)= 12 + 14
data.frame(1:3,1:3) %>% sum(.[1]*.[2])
#[1] 26