我有一个带有列的数据框:
> 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"
我想对向量中的元素进行运算,以获得每个向量中element(i)与element(ik)的比率。如果由于element(ik)的索引无效而无法获得比率,则结果应为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(..
),if
在length
所述的list
元素是1,我们返回“NA”或else
由电流值和连接具有分割的下一个值NA
。我们将其转换numeric
为原始list
元素为character
类。
lapply(df$lengths, function(x) if(length(x)==1) NA
else c(NA, as.numeric(x[-1])/as.numeric(x[-length(x)])))
我们可以将lag/lead
in函数dplyr/data.table
用于大于1的k个值。
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))})
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句