R строка слияния, которая имеет значение ниже порога и закрытие минимального значения - PullRequest
0 голосов
/ 17 марта 2020

У меня есть фрейм данных, где у каждой строки есть идентификатор и значения активности. Ниже приведен пример кадра данных:

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))

Для каждой строки с одинаковым идентификатором:

Я хочу объединить все строки, не разделенные значением> -1, близким к минимальному ценность деятельности. И сохраните первое значение начала и последнего значения конца для объединенных строк и среднее значение, вычисленное для выбранных строк.

Ожидаемый результат должен быть:

start    end    id    activity
100      300    id_1   -1.2

Сначала я удаляю строку, которая имеют большее значение, чем -1

test=test[test$activity<=-1,]

Я попытался объединить строки, используя setDT

library("data.table")
final_test=setDF(setDT(test)[, .(start = min(start), end = max(end),activity=mean(activity)),by=id])

Таким образом, он сохраняет первый и последний элемент по id и вычисляет среднее значение активности, но это не так именно то, что я хочу.

И это не работает

final_test=setDF(setDT(test)[, .(start = min(start), end = max(end),activity=mean(activity)),by=id[test$activity<=-1]])

Спасибо за вашу помощь

1 Ответ

1 голос
/ 17 марта 2020

Сначала вы можете создать столбец grp, который будет последовательно нумеровать группы как 1, 2 и т. Д. c - генерируемые приращением каждый раз, когда вы видите значение> -1.

library(dplyr)

threshold <- -1

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

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

Вывод:

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

Затем вы можете удалить значения выше -1 и сгруппировать по переменной grp, а затем легко суммировать, чтобы делать то, что вы хотите. Вы можете внести изменения в код для его точной настройки, если это необходимо.

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

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

Вывод:

# A tibble: 2 x 4
  start   end id    activity
  <dbl> <dbl> <fct>    <dbl>
1   100   300 id_1      -1.2
2   400   450 id_1      -1.2

Если вы также хотите привести сведения об операции с кратчайшей продолжительностью в группу Вы можете действовать следующим образом:

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, sub_id.min, activity.min)

Вывод

  start   end id    activity start.min end.min sub_id.min activity.min
  <dbl> <dbl> <fct>    <dbl>     <dbl>   <dbl> <fct>             <dbl>
1   100   300 id_1      -1.2       200     250 subid_1_5          -1.6
2   400   450 id_1      -1.2       400     450 subid_1_9          -1.2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...