我有一个像下面那样的矩阵:
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类似。 我怎样才能做到这一点?
答案 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