我有一个看起来像这样的数据集,其中列表中有大约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)]))