r - "mean"表示值大于 x 的连续行(按组)

标签 r linux

这是我的 df(data.frame):

group1  group2   value
chr1     a        1 
chr1     a        1
chr1     a        1
chr1     b        2.2
chr1     b        2.5 
chr1     b        2.5
chr1     b        2.8
chr2     c        3.1
chr2     c        -3.2
chr2     c        -3.7
chr2     c        -3.1
chr2     d        4

对于属于同一组2和组1的“值”列中的值,如果有超过3个连续值大于2或小于-2,则计算这些值的平均值,否则保留原始值。

输出应该是:

group1  group2   value      mean
chr1     a        1          1 # does not change because it's smaller than 2
chr1     a        1          1
chr1     a        1          1
chr1     b        2.2        2.5 # mean of 2.2, 2.5, 2.5, 2.8
chr1     b        2.5        2.5 
chr1     b        2.5        2.5 
chr1     b        2.8        2.5
chr2     c        3.1        3.1 # not used for mean calculation above (different group)
chr2     c        -3.2       -3.3 # mean of -3.2, -3.7, -3.1
chr2     c        -3.7       -3.3 
chr2     c        -3.1       -3.3 
chr2     d        4          4

感谢任何帮助。

最佳答案

使用末尾注释中可重复显示的 DF,使用 data.table 中的 rleid 创建分组变量。 data.table 不以其他方式使用。然后创建一个使用问题规则的 Mean 函数。最后将 Mean 应用于 g 的每个分量的 value

library(data.table)
g <- with(DF, rleid((value > 2) - (value < 2), group1, group2))
Mean <- function(x) if ((all(x > 2) || all(x < -2)) && length(x) >= 3) mean(x) else x
transform(DF, value2 = ave(value, g, FUN = Mean))

给予:

   group1 group2 value    value2
1    chr1      a   1.0  1.000000
2    chr1      a   1.0  1.000000
3    chr1      a   1.0  1.000000
4    chr1      b   2.2  2.500000
5    chr1      b   2.5  2.500000
6    chr1      b   2.5  2.500000
7    chr1      b   2.8  2.500000
8    chr2      c   3.1  3.100000
9    chr2      c  -3.2 -3.333333
10   chr2      c  -3.7 -3.333333
11   chr2      c  -3.1 -3.333333
12   chr2      d   4.0  4.000000

注意

Lines <- "group1  group2   value
chr1     a        1 
chr1     a        1
chr1     a        1
chr1     b        2.2
chr1     b        2.5 
chr1     b        2.5
chr1     b        2.8
chr2     c        3.1
chr2     c        -3.2
chr2     c        -3.7
chr2     c        -3.1
chr2     d        4"
DF <- read.table(text = Lines, header = TRUE, strip.white = TRUE)

关于r - "mean"表示值大于 x 的连续行(按组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60398840/

相关文章:

linux - 干净的Redhat上的MongoDB "service"无法启动

linux - 在 Linux 上为 Curl 添加对 SCP 和 SFTP 的支持

c - 奇怪的 printf() 行为

r - 打印 Shiny 的应用程序屏幕不工作错误 : shinyjs: extendShinyjs: `functions` argument must be provided

r - SVM 分类 - R 中的标准化

使用 dplyr 从另一列返回值

R:如何从雪包中获取堆栈跟踪

在 ggplot boxplot 中重新定位 stat_summary 计数

linux - 在 ubuntu 上运行 ImageMagick 脚本

linux - 从源代码为 Linux 构建 openssl 和 libcurl