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

时间:2015-10-06 14:34:09

标签: r list vector elements lapply

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

> 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中,它似乎很复杂。请指教。

1 个答案:

答案 0 :(得分:1)

我们遍历list元素(lapply(..),if length元素的list为1,我们返回'NA'或{ {1}}将下一个值除以当前值,并与else连接。我们转换为NA,原始numeric元素为list类。

character

更新

对于大于1的k值,我们可以使用 lapply(df$lengths, function(x) if(length(x)==1) NA else c(NA, as.numeric(x[-1])/as.numeric(x[-length(x)]))) 中的lag/lead函数。

dplyr/data.table

或者,如果不使用任何软件包,我们可以使用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
相关问题