【问题标题】:How to perform a looped function on a list of data frames where the function requires 2 inputs from the data frame list?如何对数据帧列表执行循环函数,其中该函数需要来自数据帧列表的 2 个输入?
【发布时间】:2017-12-19 10:04:51
【问题描述】:

我对 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

感谢有关此问题的任何和所有帮助。 谢谢

【问题讨论】:

  • 只做一个嵌套的sapplysapply(DfList, function(x) sapply(DfList, function(y) example_function(x, y)))

标签: r list function loops dataframe


【解决方案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

【讨论】:

    猜你喜欢
    • 2019-10-02
    • 2018-10-29
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 2020-05-13
    • 1970-01-01
    相关资源
    最近更新 更多