我对此循环进行了升级,(我之前的帖子)How to create a for loop in R for this peculiar calculation
但是,这次我想将循环应用于不同的列。
鉴于这些不同的数据帧df(A)
(nrow = 10,ncol = 5),df(B)
(nrow = 3,ncol = 2),df(C)
(nrow = 4,ncol = 2),{ {1}}(nrow = 6,ncol = 1)
df(D)
我想:
df(A) df(B) df(C) df(D)
col1 col2 col3 col4 col5 col1 col2 col3 col4 col5
1 2 4 4 2 1 4 5 4 5
3 5 7 2 1 2 7 7 5 6
5 7 6 6 3 3 9 8 7 1
6 9 5.9 8 6 8 9 4
9 11 8 4 9 8
4.5 5.5 7.9 6 7.3 10
21 6.7 13.6 8.7 2
3.5 5 6 6 6
6 7.9 1 9 7
67 4 2 2 6
中每列的值与相应列的df(A)
,df(B)
和df(C)
相乘(请参阅{{1的列的名称) }})让我举个例子:
df(D)
等从df
的前两列(直到最后一个可能的三元组)的每个值开始,对于A[1,1]*B[1,1] + A[2,1]*B[2,1] + A[3,1]*B[3,1]= 1*1+3*2+5*3= 22 # first expected result
A[2,1]*B[1,1] + A[3,1]*B[2,1] + A[4,1]*B[3,1]= 3*1+5*2+6*3 = 31 # second expected result
...........
A[8,1]*B[1,1] + A[9,1]*B[2,1] + A[10,1]*B[3,1]= 3.5*1+6*2+67*3 = 216.5 # last expected result
。接着,df(A)
的col3和col4为col3,col4为df(B)
,为4值加总,直到最后4个加值,如下所示:
df(A)
等等df(C)
的col3和col4分别为`A[1,3]*C[1,1]+A[2,3]*C[2,1]+A[3,3]*C[3,1]+A[4,3]*C[4,1]= 4*5+7*7+6*8+5.9*8= 164.2 first expected result
A[2,3]*C[1,1]+A[3,3]*C[2,1]+A[4,3]*C[3,1]+A[5,3]*C[4,1]= second expected result
A[7,3]*C[1,1]+A[8,3]*C[2,1]+A[9,3]*C[3,1]+A[10,3]*C[4,1]= last expected result
的第3列和第4列。
最后df(A)
的{{1}}的col5,直到可以添加的最后6个可能的值
df(C)
预期结果是具有5列的数据框,并且取决于df(A)
和df(D)
的哪一列的行数与A[1,5]*D[1,1]+A[2,5]*D[2,1]+A[3,5]*D[3,1]+A[4,5]*D[4,1]+A[5,5]*D[5,1]+A[6,5]*D[6,1]= 2*5+1*6+3*1+6*4+9*8+7.3*10= first result
A[2,5]*D[1,1]+A[3,5]*D[2,1]+A[4,5]*D[3,1]+A[5,5]*D[4,1]+A[6,5]*D[5,1]+A[7,5]*D[6,1]= second result
A[5,5]*D[1,1]+A[6,5]*D[2,1]+A[7,5]*D[3,1]+A[8,5]*D[4,1]+A[9,5]*D[5,1]+A[10,5]*D[6,1]= last expected result
的相应列相乘。因此,预期df B C
的行数可以等于D
的{{1}}的最后一次操作,总行数为5。
我试过这个for循环代码:
df(A)
但是R回复
df
答案 0 :(得分:2)
导入您的数据(下次请更容易):
A <- read.table(text = "col1 col2 col3 col4 col5
1 2 4 4 2
3 5 7 2 1
5 7 6 6 3
6 9 5.9 8 6
9 11 8 4 9
4.5 5.5 7.9 6 7.3
21 6.7 13.6 8.7 2
3.5 5 6 6 6
6 7.9 1 9 7
67 4 2 2 6", header = TRUE)
B <- read.table(text = "col1 col2
1 4
2 7
3 9 ", header = TRUE)
C <- read.table(text = "ccol3 col4
5 4
7 5
8 7
8 9 ", header = TRUE)
D <- read.table(text = "col5
5
6
1
4
8
10", header = TRUE)
结合B
,C
,D
:
filters <- c(B, C, D)
使用filter
:
mapply( #loop over corresponding pairs
stats::filter, #function for linear filter
A, #use first, second, ... column of A
lapply(filters, rev), #use first, second, ... filter, but reverse them first
sides = 1 #filter not centered, but for past values
)
# col1 col2 col3 col4 col5
# [1,] NA NA NA NA NA
# [2,] NA NA NA NA NA
# [3,] 22.0 106.0 NA NA NA
# [4,] 31.0 150.0 164.2 140.0 NA
# [5,] 44.0 190.0 188.2 130.0 NA
# [6,] 37.5 162.5 198.5 146.0 188.0
# [7,] 81.0 142.8 257.5 172.3 143.4
# [8,] 57.0 113.9 252.1 160.9 165.2
# [9,] 46.0 132.9 190.7 190.5 217.3
#[10,] 216.5 111.3 134.0 145.8 230.8