从位置矩阵创建区域矩阵

时间:2018-04-12 03:22:33

标签: r matrix

我有一个像下面那样的矩阵:

position    case    control   
1            2        1      
2            4        10
3            1        7
6            12       3
8            5        5 
9            22       9
10           1        24
11           12       2

我想确定区域(每个方面的位置值等于1)并创建一个矩阵如下:

region    start    end    min_case     max_case   mean_case    min_control   
1         1        3      1            4          2.33         1      
2         6        6      12           12         12           3
3         8        11     1            22         10           2

min_case是在区域中找到的位置的最小值,max_case,mean_case和min_control类似。 我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

以下是使用tidyverse套件的解决方案。

library(tidyverse)
new_df <- df %>%
  as.data.frame() %>%
  mutate(
    jump = position - c(-1, position[-length(position)]),
    region = cumsum(jump != 1)
  ) %>%
  group_by(region) %>%
  summarize(
    start = min(position),
    end = max(position),
    min_case = min(`#case`),
    max_case = max(`#case`),
    mean_case = mean(`#case`),
    min_control = min(`#control`)
  )

如果您不熟悉管道运算符(%>%),那么它只是对元素(例如数据帧)执行一系列操作而无需嵌套或一堆临时变量的方法。它接受每个操作的结果并将其插入下一个操作的第一个条目。因此as.data.frame函数的结果将是mutate函数的第一个元素。

(注意 - 如果没有可重复的示例,我无法对此进行测试,并且我没有对所有这些进行编码,因此如果它出错,请发布代码以生成数据,我可以修复它。)< / p>

答案 1 :(得分:0)

解决方案是使用getA1Notation()diff中查找连续序列以创建组。在选择所需列之前,position可用于获取所有列的dplyr::summarise_all

min/max/mean