如何在数据框列表中执行循环函数,其中函数需要来自数据框列表的2个输入?

问题描述 投票:1回答:1

我对R编码的更高级部分仍然相当新,并希望帮助制作循环。

我有多个数据帧,我需要在每个数据帧上执行重复功能。

Df1 <- data.frame(Col_1=c("A","B","C"), Col_2=c(1:3))
Df2 <- data.frame(Col_1=c("D","E","F"), Col_2=c(4:6))
Df3 <- data.frame(Col_1=c("G","H","I"), Col_2=c(7:9))
Df4 <- data.frame(Col_1=c("J","K","L"), Col_2=c(10:12))
DfList <- list(Df1,Df2,Df3,Df4)

因此数据框具有以下格式

>print(Df1)
  Col_1 Col_2
1     A     1
2     B     2
3     C     3

有问题的功能需要2个输入(列表中包含2个不同的数据帧:Dflist

example_function <- function(Dataframe_x,Dataframe_y){
  X_Sum_col_2 <- sum(Dataframe_x$Col_2)
  Y_Sum_col_2 <- sum(Dataframe_y$Col_2)
  ratio <- X_Sum_col_2/Y_Sum_col_2
}

>print(example_function(Df1,Df2))
0.4

我的目标是使用example_function循环遍历所有可能的DfList比较,以产生具有结果的数据帧,类似于相似性矩阵。像这样:

      Df1   Df2   Df3   Df4
Df1   1     2.5   4     5.5
Df2   0.40  1     1.6   2.2
Df3   0.25  0.63  1     1.38
Df4   0.18  0.45  0.73  1

每当我尝试这个时,它要么告诉我我没有分配第二个变量(不知道怎么做):

>lapply(DfList,function(Dataframe_x,Dataframe_y){
  X_Sum_col_2 <- sum(Dataframe_x$Col_2)
  Y_Sum_col_2 <- sum(Dataframe_y$Col_2)
  ratio <- X_Sum_col_2/Y_Sum_col_2
    })
Error in FUN(X[[i]], ...) : 
  argument "Dataframe_y" is missing, with no default

或者它在尝试for循环时给出了这个错误:

>for(i in 1:4(DfList)){
  example_function(i,i)
}
Error: attempt to apply non-function

关于这个问题的任何和所有帮助表示赞赏。谢谢

r list function loops dataframe
1个回答
1
投票

我们可以使用nested循环

res <- sapply(DfList, function(x) sapply(DfList, function(y) example_function(x, y)))
nm1 <- paste0("Df", 1:4)
dimnames(res) <- list(nm1, nm1)
round(res, 2)
#     Df1  Df2  Df3  Df4
#Df1 1.00 2.50 4.00 5.50
#Df2 0.40 1.00 1.60 2.20
#Df3 0.25 0.62 1.00 1.38
#Df4 0.18 0.45 0.73 1.00
© www.soinside.com 2019 - 2024. All rights reserved.