gpt4 book ai didi

r - 将数值向量拆分为不相等的部分,然后将自定义函数应用于每个部分

转载 作者:行者123 更新时间:2023-12-01 12:41:28 25 4
gpt4 key购买 nike

我有一长串 1 和 0 代表鸟类孵化模式,1 表示鸟类在巢中,0 表示关闭。

    > Fake.data<- c(1,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,0,1,1,1,1,0,0,1,1,1,1,1,0,0,0,0,1,1,0,1,0)

作为一个终点,我基本上想要一个单一的值来表示每个 ON 周期和连续的 OFF 周期之间的比率。所以理想情况下,对于 Fake.data 来说,这应该是一个像这样的向量

    [1] 0.4  0.75  0.25  0.5  0.8  0.5  1 #(I just typed this out!) 

到目前为止,我已经使用 split() 将向量拆分成多个部分

    > Diff<-diff(Fake.data)
> SPLIT<-split(Fake.data, cumsum(c(1, Diff > 0 )))
> SPLIT

哪个返回...

    $`1`
[1] 1 1 1 1 1 0 0
$`2`
[1] 1 1 1 1 0 0 0
$`3`
[1] 1 1 1 1 0
$`4`
[1] 1 1 1 1 0 0
$`5`
[1] 1 1 1 1 1 0 0 0 0
$`6`
[1] 1 1 0
$`7`
[1] 1 0

所以我可以使用

获得单个拆分组的比率
    > SPLIT$'1'<- ((length(SPLIT$'1'))-(sum(SPLIT$'1')))/sum(SPLIT$'1')
> SPLIT$'1'
[1] 0.4

但是在我的数据中,我有几千个这样的事情要做,我想应用某种 tapply() 或 for() 循环来自动计算所有这些并将其放入单个向量中。我已经尝试了这些方法中的每一种,但收效甚微,因为 split() 输出结构似乎不适合这些函数?

我创建了一个新向量来接收 for() 循环输出

    ratio<-rep(as.character(NA),(length(SPLIT)))

然后使用上面的代码尝试 for() 循环,该代码只运行一次。

    for(i in SPLIT$'1':'7')
{ratio[i]<-((length(SPLIT$'[i]'))-(sum(SPLIT$'[i]')))/sum(SPLIT$'[i]')}

我得到的是...

[1] “NaN” “NaN” “NaN” “NaN” “NaN” “NaN” 不适用

沿着这个主题尝试了许多其他变体,但现在真的卡住了!

最佳答案

我认为您的战略非常接近。 sapply 函数非常适合处理列表。我只想将最后一步更改为

sapply(SPLIT, function(x) sum(x==0)/sum(x==1))

返回

   1    2    3    4    5    6    7 
0.40 0.75 0.25 0.50 0.80 0.50 1.00

与您的示例数据。不需要额外的包。

关于r - 将数值向量拆分为不相等的部分,然后将自定义函数应用于每个部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24126276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com