向量列表中向量元素的比率

Ratio of elements of vectors, in a list of vectors

我有一个数据框,其中有一列:

> head(df$lengths,5)
[[1]]
[1] "28"

[[2]]
[1] "33"

[[3]]
[1] "47" "37" "42" "41"

[[4]]
[1] "41" "39" "64" "54"

[[5]]
[1] "45" "22" "23"

我想对向量中的元素进行操作,以获得每个向量中元素(i) 与元素(i-k) 的比率。如果因为元素 (i-k) 具有无效索引而无法获得比率,则结果应为 NA。所需的输出是这样的,其中我指定 k=1:

[[1]]
[1] NA

[[2]]
[1] NA

[[3]]
[1] NA (37/47) (42/37) (41/42)

[[4]]
[1] NA (39/41) (64/39) (54/64)

[[5]]
[1] NA (22/45) (23/22)

至于 k=2:

[[1]]
[1] NA

[[2]]
[1] NA

[[3]]
[1] NA NA (42/47) (41/37)

[[4]]
[1] NA NA (64/41) (54/39)

[[5]]
[1] NA NA (23/45)

我不知道如何处理这个问题,我想执行一些循环,但在 R 中,这似乎很复杂。请指教

我们循环遍历list个元素(lapply(..),iflist个元素的length为1,我们return 'NA' 或 else 将下一个值除以当前值并与 NA 连接。我们转换为 numeric,因为原始的 list 元素是 character class.

 lapply(df$lengths, function(x) if(length(x)==1) NA
            else c(NA, as.numeric(x[-1])/as.numeric(x[-length(x)])))

更新

对于大于 1 的 k 个值,我们可以在 dplyr/data.table 中使用 lag/lead 函数。

library(dplyr)
k <- 2
lapply(df$lengths, function(x) {x <- as.numeric(x)
               if(length(x)==1) NA 
                 else c(rep(NA,k), na.omit(lead(x,k)))/na.omit(lag(x,k))})
#[[1]]
#[1] NA

#[[2]]
#[1] NA

#[[3]]
#[1]       NA       NA 0.893617 1.108108

#[[4]]
#[1]       NA       NA 1.560976 1.384615

#[[5]]
#[1]        NA        NA 0.5111111

或者不使用任何包,我们可以使用head/tail函数

lapply(lst, function(x) {x <- as.numeric(x)
               if(length(x)==1) NA 
               else c(rep(NA, k), tail(x, -k)/head(x,-k))})