gpt4 book ai didi

r - 在向量 (R) 中的某些值上应用函数

转载 作者:行者123 更新时间:2023-12-04 17:48:54 24 4
gpt4 key购买 nike

我想知道这个问题是否有一些优雅的解决方案:

假设我有一个值向量
a <- c(1,2,3,3.1,3.2,5,6,7,7.1,7.2,9)
并且我只想将某些函数(例如平均值)应用于满足特定条件的值,在这种情况下,值之间的差异小于 0.5 。

所以应该平均的值是 (3,3.1,3.2)(7,7.1,7.2)并且函数应该返回向量
b <- c(1,2,3.1,5,6,7.1,9)
编辑:我尝试过的一种方法(不确定是否正确)是将向量二值化 a (1 表示值之间的差异 <0.5;0 表示差异 >0.5),所以我得到了向量
bin <– c(0,0,1,1,0,0,0,1,1,0)
但我不知道如何将均值应用于不同的组。所以我的主要问题是区分所需值的组并将平均值分别应用于它们。有任何想法吗?

我是新来的,所以如果有什么不清楚的,请告诉我。先感谢您。

最佳答案

这不符合优雅,但我认为它适用于您提供的情况。我用 rle (base R) 来识别差异小于 0.5 的运行。

a <- c(1, 2, 3, 3.1, 3.2, 5, 6, 7, 7.1, 7.2, 9) 
crit <- diff(a) < 0.5
crit <- c(head(crit, 1), crit) | c(crit, tail(crit, 1))
run <- rle(crit)
aa <- split(a, rep(seq(length(run$lengths)), times=run$lengths))
myFun <- function(crit, val) {
if (crit) {
mean(val)
}
else {
val
}
}
unlist(mapply(FUN=myFun, crit=run$values, val=aa, USE.NAMES=FALSE))

产量:
> unlist(mapply(FUN=myFun, crit=run$values, val=aa, USE.NAMES=FALSE))
[1] 1.0 2.0 3.1 5.0 6.0 7.1 9.0

也许有人可以从中构建更清洁的解决方案。

更新:OP 指出这在 {3, 3.1, 3.2, 7, 7.1, 7.2} 这样的序列上失败,因为上面的代码将其合并为一次运行并在整个序列中求平均值。这是一个更强大的解决方案。
a <- c(1, 2, 3, 3.1, 3.2, 7, 7.1, 7.2, 10)

run <- unclass(rle(diff(a) < 0.5))
len <- run$lengths
val <- run$values
pos <- seq_along(len)
last <- pos == max(pos)
len <- len + val - c(0, head(val, -1)) + (last * !val)
prevLen <- c(0, head(cumsum(len), -1))
myFun <- function(l, v, pl, x) {
if (l == 0) {
NULL
} else {
seg <- seq(l) + pl
if (v == TRUE) {
mean(x[seg])
} else {
x[seg]
}
}
}
unlist(mapply(FUN=myFun, l=len, v=val, pl=prevLen, MoreArgs=list(x=a)))

现在,每当遇到小差异运行(即 val == TRUE )时,它都会在该小差异运行(即 len + val )的长度上增加一个,但是额外的元素来自下一次运行,但它不能如果不是小差异运行(即 last * !val ),则不要从上次运行中窃取。

关于r - 在向量 (R) 中的某些值上应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22879450/

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