【问题标题】:Applying specific function to all possible pairwise column combinations of a data frame将特定函数应用于数据框的所有可能的成对列组合
【发布时间】:2018-09-21 12:19:27
【问题描述】:

我需要得到不同对的格兰杰检验结果。

这是给出所需结果的函数 (p_value),它工作正常。

myFunction<-function(x,y)

{
  test<-grangertest(x~y,data=df)
  return(test$`Pr(>F)`[2])
}

这个函数很好用,比如这个例子:

myFunction(df$X48df886f9,df$X0deb4b6a8)

现在,我准备了所有可能的组合:

list_1<-list(names(df))
list_2<-list(names(df))

combinations<-expand.grid(list_1,list_2)

为了使这个可重现,我为您选择了前 6 个变量

> df[1:50,1:6]
     target X48df886f9 X0deb4b6a8 X34b15f335 a8cb14b00 X2f0771a37
1  17.45310          0          0          0         0          0
2  13.30469          0          0          0         0          0
3  16.11810          0          0          0         0          0
4  14.50866          0          0          0         0          0
5  16.48274          0          0          0         0          0
6  14.84513          0          0          0         0          0
7  12.00763          0          0          0         0          0
8  13.30469          0          0          0         0          0
9  13.79429          0          0          0         0          0
10 13.03898          0          0          0         0          0
11 13.91082          0          0          0         0          0
12 16.58810          0          0          0         0          0
13 12.77706          0          0          0         0          0
14 15.76142          0          0          0         0          0
15 11.51294          0          0          0         0          0
16 13.59237          0          0          0         0          0
17 12.20608          0          0          0         0          0
18 15.09644          0          0          0         0          0
19 14.84012          0          0          0         0          0
20 10.59666          0          0          0         0          0
21 14.28551          0          0          0         0          0
22 14.99928          0          0          0         0          0
23 15.63034          0          0          0         0          0
24 16.51593          0          0          0         0          0
25 13.63319          0          0          0         0          0
26 12.89922          0          0          0         0          0
27 15.68731          0          0          0         0          0
28 14.34614          0          0          0         0          0
29 13.74652          0          0          0         0          0
30 15.20181          0          0          0         0          0
31 11.53274          0          0          0         0          0
32 16.81124          0          0          0         0          0
33 15.35596          0          0          0         0          0
34 16.81124          0          0          0         0          0
35 13.69898          0          0          0         0          0
36 15.60727          0          0          0         0          0
37 16.81124          0          0          0         0          0
38 14.50866          0          0          0         0          0
39 16.70588          0          0          0         0          0
40 15.67181          0          0          0         0          0
41 16.81124          0          0          0         0          0
42 16.11810          0          0          0         0          0
43 15.42495          0          0          0         0          0
44 16.01274          0          0          0         0          0
45 17.36334          0          0          0         0          0
46 15.20181          0          0          0         0          0
47 14.31629          0          0          0         0          0
48 15.31959          0          0          0         0          0
49 16.39573          0          0          0         0          0
50 16.11810          0          0          0         0          0

当我想对所有可能的组合应用测试时,我使用了 mapply 作为:

res_matrix <- mapply(myFunction,df[,which(names(df) %in% c(combinations$Var1))],df[,which(names(df) %in% c(combinations$Var2))])

但它返回空结果:

> res_matrix
named list()

我该如何解决这个问题?

【问题讨论】:

  • 欢迎来到 StackOverflow!请阅读有关how to ask a good question 的信息以及如何提供reproducible example。这将使其他人更容易帮助您。
  • 你的函数的 xy 参数在 df 方面是什么?请务必制作可重现的示例,我会为您提供apply 的帮助,现在我还不清楚。
  • @YoB.,例如 df$X48df886f9df$X0deb4b6a8。它适用于这种情况
  • 所以xX48df886f9 列,yX0deb4b6a8 列?测试每次都使用整个列,并且您希望对 2 列的每个组合都使用它?
  • @YoB.,没错。但是当我只用X48df886f9 替换x 时。它不起作用。您应该将其替换为df$X48df886f9,如编辑后的问题所示。

标签: r


【解决方案1】:

这是一个提议,如果需要,请要求澄清/修改。我没有grangertest,所以我输入了一个假函数。

data <- data.frame(target=runif(11), 
                   col1=0, col2=0, col3=0, 
                   col4=0, col5=0)

grangertest <- function(x,y){ # fake test
  length(x) * length(y)
}

outer(colnames(data), colnames(data), # pairwise operation
      FUN=Vectorize(function(a,b) grangertest(x=data[,a], y=data[,b])))

【讨论】:

  • 对不起.. 你能尝试制作最小的可重现示例吗?如果是这样,我可以为您提供一个有效的技巧。否则,我不得不猜测你的数据如何,它的效率较低。
  • 我的数据集太大的问题。我说你可以使用df=df[1:50,1:6]。或者按照你的建议。我认为这不是数据问题
  • 所以可能是grangertest,你能提供这个功能吗?我刚刚做了一个函数,它有 2 个向量作为输入,并输出一个标量。我认为您的测试功能可以做到这一点,但无法确认。我生成的数据适合你吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
相关资源
最近更新 更多