使用扫描功能在R中应用来自不同列表的函数

时间:2014-12-23 21:00:22

标签: r list matrix dataframe

我有两个列表,每个列表都有多个元素,每个元素都是一个数据框。作为一个例子

set.seed(1234)
k = data.frame(a=rnorm(5,10),b=rnorm(5,10))
l = data.frame(a=rnorm(5,3),b=rnorm(5,3))

lista <- list(k=k,l=l)

k = data.frame(x=rnorm(5,20))
l = data.frame(x=rnorm(5,6))

listb <- list(k=k,l=l)



> lista
$k
          a         b
1  8.792934 10.506056
2 10.277429  9.425260
3 11.084441  9.453368
4  7.654302  9.435548
5 10.429125  9.109962

$l
         a        b
1 2.522807 2.889715
2 2.001614 2.488990
3 2.223746 2.088805
4 3.064459 2.162828
5 3.959494 5.415835


> listb
$k
         x
1 20.13409
2 19.50931
3 19.55945
4 20.45959
5 19.30628

$l
         x
1 4.551795
2 6.574756
3 4.976344
4 5.984862
5 5.064051

我想从lista中获取每列和listb中的对应列并应用以下公式:

(lista$k[1]-listb$k[1])/(abs(lista$k[1])+abs(listb$k[1]))
(lista$k[2]-listb$k[1])/(abs(lista$k[2])+abs(listb$k[1]))

"l"重复相同的内容。

我尝试使用扫描功能和R中的Map,如下所示:

form <- Map(function(x,y) abs(sweep(x,1,y,FUN="-"))/(sweep(abs(x),1,abs(y),FUN="+")),lista,listb)

我收到以下错误,非常感谢任何帮助

Error in Ops.data.frame(x, aperm(array(STATS, dims[perm]), order(perm)),  : 
  list of length 10 not meaningful

编辑:将data.frame转换为矩阵可以提供所需的输出。

form <- Map(function(x,y) abs(sweep(as.matrix(x),1,as.matrix(y),FUN="-"))/(sweep(abs(as.matrix(x)),1,abs(a‌​s.matrix(y)),FUN="+")),lista,listb)

1 个答案:

答案 0 :(得分:0)

在扫描功能中将数据帧更改为矩阵能够提供所需的输出。

form <- Map(function(x,y) abs(sweep(as.matrix(x),1,as.matrix(y),FUN="-"))/(sweep(abs(as.matrix(x)),1,abs(a‌​s.matrix(y)),FUN="+")),lista,listb)