对于R中的数据帧列表,为每一列查找每一列条目与下一条目之间的比率



我有一个看起来像这样的数据集,其中列表中有大约500个数据帧:

1   1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1   2
1   1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1   2
1   1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1   2
1   1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1   2
1   1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1   2
1   1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1   2
1   1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1   2
1   1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1   2
1   1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1   2
1   1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1   2

在每一列中,我想找到第一个值与第二个值的比率,然后是第三个值与四个值的比例,然后是五个值与六个值的比值,等等。然后我想对每一列都这样做,并将其输出到一个新的数据帧。像这样:


1   1   1   1   1   1   1   1   0.5                         
1   1   1   1   1   1   1   1   0.5
1   1   1   1   1   1   1   1   0.5
1   1   1   1   1   1   1   1   0.5
1   1   1   1   1   1   1   1   0.5
1   1   1   1   1   1   1   1   0.5 
1   1   1   1   1   1   1   1   0.5
1   1   1   1   1   1   1   1   0.5
1   1   1   1   1   1   1   1   0.5                         
1   1   1   1   1   1   1   1   0.5

我希望能够一次将其应用于数据帧列表。

我得到的最接近的是一个数据帧,只有一列。。。其中我还必须删除其他所有值(这是可以的,我可以在后期处理中这样做(。

ratio = df[[1]][,1]/lag(df[[1]][,1],1)

但同样,它需要将每一列都放入新的数据帧中,应用于数据帧列表。

请注意,实际值可以是0到2000之间的任何值,它们不一定都是1和2。

数据

df <- data.frame(cbind(1, 1, 1, 1, 1, 1, 1, 1, rep(1:2, 10)))
ll <- list(df, df, df)

我们可以使用apply函数,也可以与seq函数一起使用。关键在于我们正在使用seq函数。第一个是我们以2(1,3,5,…(的步长从1迭代到n,下一个是以2(2,4,6,…(为步长从2迭代到n。如果行数不是偶数,这可能会导致问题。

apply(d, 2, 
FUN = function(x) x[seq(1, length(x), by = 2)] / x[seq(2, length(x), by= 2)])
V1 V2 V3 V4 V5 V6 V7 V8  V9
[1,]  1  1  1  1  1  1  1  1 0.5
[2,]  1  1  1  1  1  1  1  1 0.5
[3,]  1  1  1  1  1  1  1  1 0.5
[4,]  1  1  1  1  1  1  1  1 0.5
[5,]  1  1  1  1  1  1  1  1 0.5
[6,]  1  1  1  1  1  1  1  1 0.5
[7,]  1  1  1  1  1  1  1  1 0.5
[8,]  1  1  1  1  1  1  1  1 0.5
[9,]  1  1  1  1  1  1  1  1 0.5
[10,]  1  1  1  1  1  1  1  1 0.5

使用您添加到问题中的列表:

lapply(ll, 
FUN = function(d) 
apply(d, 2, 
FUN = 
function(x) x[seq(1, length(x), by = 2)] / x[seq(2, length(x), by= 2)]))

相关内容

  • 没有找到相关文章

最新更新