R 获取两列乘积的和

R 获取两列乘积的和,r,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 我们可以使用Reduce得到行积,然后求和 或者正如注释中提到的@eipi,使用{}也可以工作 qqq %>%

有人能解释一下我对以下功能的操作顺序是如何错误的吗?我希望在每一行上相乘,然后对结果求和,但我得到的答案却大不相同

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
我们可以使用Reduce得到行积,然后求和

或者正如注释中提到的@eipi,使用{}也可以工作

qqq %>%
   {.[,1]*.[,2]} %>%
   sum
或者使用@thelatemail中的do

qqq %>% 
    do(.[1]*.[2]) %>%
    sum

我认为一个简单的例子解释了这里发生的事情,即使我不知道为什么会发生在底层代码方面:

将整个数据集传递给sum操作,然后将其与sum操作中的表达式一起求和:

在最简单的示例中,相当于sumdata.frame1: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+sum1:3*1:3=12+14

data.frame(1:3,1:3) %>% sum(.[1]*.[2])
#[1] 26

你知道为什么我尝试的结果会给出如此奇怪的答案吗?在一个没有真实列名的数据帧的不寻常情况下,qqq%>%Summaresum.[,1]*.[2]会是标准的dplyr语法吗?如果你有列名,比如v1和v2,那么qqq%>%SummarseSumv1*v2.@Rilcon42这是一个奇怪的结果,我不确定它是如何得到的,也许1+6*4+5*2+6*3QQ%>%>%{.[1]*.[2]}%>%sum和QQQQ%>%sum1,prod%>%sum也能工作。我以前没有在dplyr之外使用%>%,但也许这就是magrittr管道在dplyr上下文之外的工作方式。我被难住了。。。qqq%>%sum.[1]给出27,qqq%>%sum.[2]给出36-go数字。qqq%>%do.[1]*.[2]>%sum也可以正常工作。
data.frame(1:3,1:3) %>% sum(.[1]*.[2])
#[1] 26