R合并等于最小值的行并保留列的第一个元素和另一列的最后一个元素

不悲伤

我有一个数据框,其中每一行都有一个 ID 和活动值。下面是一个示例数据框:

test=data.frame(
start=c(1,50,100,150,200,250,300,350,400,450,500,100,150,200),
end=c(50,100,150,200,250,300,350,400,450,500,550,150,200,250),
sub_id=c("subid_1_1","subid_1_2","subid_1_3","subid_1_4","subid_1_5","subid_1_6","subid_1_7","subid_1_8","subid_1_9","subid_1_10","subid_1_11","subid_2_1","subid_2_2","subid_2_3"),
id=c(rep("id_1",11),rep("id_2",3)),
activity=c(-0.2,-0.6,-1,-1.2,-1.6,-1.6,-0.5,0.2,-1.2,-0.8,0.1,0.1,1.2,0.5))




print(test)
       start end     sub_id   id activity
    1      1  50  subid_1_1 id_1     -0.2
    2     50 100  subid_1_2 id_1     -0.6
    3    100 150  subid_1_3 id_1     -1.0
    4    150 200  subid_1_4 id_1     -1.2
    5    200 250  subid_1_5 id_1     -1.6
    6    250 300  subid_1_6 id_1     -1.6
    7    300 350  subid_1_7 id_1     -0.5
    8    350 400  subid_1_8 id_1      0.2
    9    400 450  subid_1_9 id_1     -1.2
    10   450 500 subid_1_10 id_1     -0.8
    11   500 550 subid_1_11 id_1      0.1
    12   100 150  subid_2_1 id_2      0.1
    13   150 200  subid_2_2 id_2      1.2
    14   200 250  subid_2_3 id_2      0.5

对于具有相同 ID 的每一行:

我合并了所有没有被值分隔的行 > -1,这些行接近最小活动值。并保留合并行的起始值和结束值的第一个值,并在所选行上计算平均值。

我这样做了:

library(dplyr)

threshold <- -1

test.group <- test %>%
  mutate(grp = cumsum(activity > threshold)) 

print(test.group, row.names = F)

test.result <- 
  test.group %>%
  subset(activity <= -1) %>%
  group_by(id, grp) %>%
  arrange(activity) %>%
  summarise(
    start.min = first(start),
    end.min = first(end),
    sub_id.min = first(sub_id),
    activity.min = first(activity),
    start = min(start), 
    end = max(end), 
    activity = mean(activity)
  ) %>% 
  ungroup() %>%
  select(start, end, id, activity, start.min, end.min, activity.min)

我的问题是我不能有连续 min(activity) 的 min(start.min) 和 max(end.min)。我总是显示一个区域的最小活动。但是,如果我有 2 个等于最小值,我该怎么做?

预期输出:

start   end id    activity start.min end.min activity.min
  <dbl> <dbl> <fct>    <dbl>     <dbl>   <dbl>            <dbl>
1   100   300 id_1      -1.2       200     300          -1.6
2   400   450 id_1      -1.2       400     450          -1.2
罗纳克·沙阿

我们可以data.table::rleid用来创建组,删除行activity <= -1并找到每个组中的相关数字。

library(dplyr)

test %>%
  group_by(gr = data.table::rleid(activity <= -1)) %>%
  filter(activity <= -1) %>%
  summarise(start_1 = first(start), 
            end_1 = last(end), 
            id = first(id),
            activity_1 = mean(activity), 
            activity.min = min(activity), 
            start.min = min(start[activity == activity.min]), 
            end.min = max(end[activity == activity.min])) %>%
   select(-gr)

#   start_1 end_1 id    activity_1 activity.min start.min end.min
#    <dbl> <dbl> <fct>      <dbl>        <dbl>     <dbl>   <dbl>
#1     100   300 id_1       -1.35         -1.6       200     300
#2     400   450 id_1       -1.2          -1.2       400     450

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

熊猫通过保留一列的第一个元素和另一列的最后一个元素来合并

获取数据框列的第一个和最后一个值尊重另一列

创建一个矩阵,其中每个元素等于其行和列索引的最小值

保留数组的第一个索引元素和最后一个索引元素

减少ndarray的第一个维度-保留第一个和最后一个元素

保留 DataFrame 中列的第一个元素

删除第一个和最后一个出现列值的行

添加一个列项,作为另一列中列表的第一个元素

将值移动到另一列的第一个值所在的行

如何基于另一个列值获取一个列的第一个和最后一个值

从每个组中检索列的最后一个元素,并将其用作下一组中同一列的第一个元素

熊猫groupby并减去一列的最后一个值与另一列的第一个值

删除行中第一个和最后一个元素的填充

对应于另一列中数字的第一个和最后出现的一列中的值之和-MATLAB

R:识别重复组中的第一个和最后一个元素

SQL合并列的第一个和最后一个值以创建到第三列的范围

如何在数据框列中查找第一个和最后一个元素并修剪这些元素之间的值

按某一列将数据帧压缩为包含第一个和最后一个时间戳以及值均值的行

熊猫从组中获取列的第一个和最后一个值

交替打印最后一个元素和第一个元素(JavaScript)

从第一个到最后一个连接,但在另一列中连接

SQL在一行中选择第一个值,然后将该值插入另一列

返回每列R的第一个和最后一个非NA值的年份

如何从外壳中的一行中的一列中的最后一个值中减去第一个值?

根据另一列中的匹配值和第三列中的第一个值的不同出现,对一列中的值求和

python27 matplotlib:连接的第一个和最后一个元素

仅循环第一个和最后一个元素

遍历numpy ndarray,管理第一个和最后一个元素

Java列表处理第一个和最后一个元素