我有两个列表,每个列表都有多个元素,每个元素都是一个数据框。作为一个例子
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(as.matrix(y)),FUN="+")),lista,listb)
答案 0 :(得分:0)
在扫描功能中将数据帧更改为矩阵能够提供所需的输出。
form <- Map(function(x,y) abs(sweep(as.matrix(x),1,as.matrix(y),FUN="-"))/(sweep(abs(as.matrix(x)),1,abs(as.matrix(y)),FUN="+")),lista,listb)