使用带

时间:2016-01-14 10:31:50

标签: r loops dataframe

我有两个数据框:df(A)(nrow = 10,ncol = 2)和df(B)(nrow = 3,ncol = 2)。

 df(A)                    df(B)
col1  col2            col1 col2                     
1      2                13  34 
3      5                22  56 
5      7                30  42 
6      9                 
9      11                 
4.5   5.5                 
21    6.7                 
3.5   5                   
6     7.9                 
67     4                  

在这种模式下,可以将df(A)中的每个值相乘和求和吗? :
   实施例:

A[1,1]*B[1,1] + A[1,1]*B[1,2] + A[1,1]*B[1,3]= 1*13+1*22+1*30= 65 
A[2,1]*B[1,1] + A[2,1]*B[1,2] + A[2,1]*B[1,3]= 3*13+3*22+3*30 = 195
and so on for all row in A&col1 for B$col1

A $ col2和B $ col2

相同
A[1,2]*B[1,1] + A[1,2]*B[1,2] + A[1,2]*B[1,3]= 2*34+2*56+2*42= 264
A[2,2]*B[1,1] + A[2,2]*B[1,2] + A[2,2]*B[1,3]= 5*34+5*56+5*42=660
and so on for all row in A&col2 for B$col2

预期结果为df(C),其中包含2列和10行。

我用apply诱惑,但它适用于整行或整个列。这个例子很简单,但我的真df是最大的,有10列,超过1000行。 循环for有可能吗? 我以这种方式用循环for诱惑:

temp <- rep(NA,3)

my_matrix <- matrix(0,ncol=ncol(A),nrow=nrow(A))

for (i in 1:nrow(A)){
  for (j in 1:3){
    temp(j) <- A(i+j-1)*B(i+j-1)
  }
  my_matrix(i) <- sum(temp)
}

但是R回答:Error: could not find function "A"

attempt to apply non-function`

提前谢谢。

1 个答案:

答案 0 :(得分:1)

我可能完全错了,但我会选择这样的事情:

1)创建所有组合的网格

Grid<-expand.grid(1:5,1:5)

编辑:匹配您对&#34;相反产品&#34;

的定义

2)将您的数据框设置为感兴趣的值

result<-matrix()
for(i in 1:nrow(Grid)){
   First<-A[A[,3]==Grid[i,1],1]*B[B[,3]==4-Grid[i,2],1] ### Gets the first column product, and does the "Contrary product" that you mention in comments
   Second<-A[A[,3]==Grid[i,1],2]*B[B[,3]==4-Grid[i,2],2] ### Gets the second column product
   result<-rbind(result,cbind(First,Second,Grid[i,1],Grid[i,2])) ### Keep track of the values you used for subsetting
}