Как извлечь такое же и самое высокое значение? - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть таблица, как показано ниже, мне нравится извлекать строки, если они имеют одинаковое значение в строках 4 и 8, в противном случае - максимальное значение.

Input: data

1   9708  10948  1  1   9708  10948  1
1  11590  18647  4  1  12897  15040  2
1  11590  18647  4  1  15040  15500  3
1  11590  18647  4  1  15950  16580  2
1 108570 109500  1  1 108570 109500  1
1 440900 443400  2  1 440900 441080  1
1 440900 443400  2  1 443140 443400  1
1 539670 542200  3  1 539700 540450  2
1 539670 542200  3  1 541070 541770  2
1 539670 542200  3  1 540450 541070  3
1 712695 715758 14  1 712799 712900  5
1 712695 715758 14  1 713010 713230  8
1 751500 759199  8  1 752555 752773  5
1 761083 764000  9  1 761083 761198  1
1 761083 764000  9  1 762200 762300  8
1 761083 764000  9  1 762300 762800  9



ideal Output:

1   9708  10948  1  1   9708  10948  1
1  11590  18647  4  1  15040  15500  3
1 108570 109500  1  1 108570 109500  1
1 440900 443400  2  1 440900 441080  1
1 440900 443400  2  1 443140 443400  1
1 539670 542200  3  1 540450 541070  3
1 712695 715758 14  1 713010 713230  8
1 751500 759199  8  1 752555 752773  5
1 761083 764000  9  1 762300 762800  9

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

data<-data[which(data$V4 == data$V8),]

data<- data[ifelse(data$V4 == data$V8,data$V4,max(data$V8)),]

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Я полагаю, что операционная группа хочет сгруппировать по V3, поэтому подход должен быть сначала group_by V3, а затем фильтровать ваше состояние.

library(tidyverse)

df %>% 
  group_by(V3) %>% 
  filter(V4 == V8 | (V4 == max(V4) & V8 == max(V8)))


# A tibble: 9 x 8
# Groups:   V3 [8]
     V1     V2     V3    V4    V5     V6     V7    V8
  <int>  <int>  <int> <int> <int>  <int>  <int> <int>
1     1   9708  10948     1     1   9708  10948     1
2     1  11590  18647     4     1  15040  15500     3
3     1 108570 109500     1     1 108570 109500     1
4     1 440900 443400     2     1 440900 441080     1
5     1 440900 443400     2     1 443140 443400     1
6     1 539670 542200     3     1 540450 541070     3
7     1 712695 715758    14     1 713010 713230     8
8     1 751500 759199     8     1 752555 752773     5
9     1 761083 764000     9     1 762300 762800     9
1 голос
/ 30 апреля 2019

С dplyr:

bind_rows(
  filter(group_by(data,V4), !any(V4==V8),V8==max(V8)), 
  filter(group_by(data,V4), any(V4==V8),V4==V8)
)

Результат:

# A tibble: 9 x 8
# Groups:   V4 [7]
     V1     V2     V3    V4    V5     V6     V7    V8
  <int>  <int>  <int> <int> <int>  <int>  <int> <int>
1     1  11590  18647     4     1  15040  15500     3
2     1 440900 443400     2     1 440900 441080     1
3     1 440900 443400     2     1 443140 443400     1
4     1 712695 715758    14     1 713010 713230     8
5     1 751500 759199     8     1 752555 752773     5
6     1   9708  10948     1     1   9708  10948     1
7     1 108570 109500     1     1 108570 109500     1
8     1 539670 542200     3     1 540450 541070     3
9     1 761083 764000     9     1 762300 762800     9

Вы можете сделать то же самое в базе R с помощью split. Идея состоит в том, что вы разбиваете данные на группы на основе значения V4, а затем выбираете группы, в которых есть какой-либо случай V4 == V8, и извлекаете из него этот ряд, а также группы, в которых такого случая нет, и затем вы вытяните оттуда ряд (ы), где V8 - это макс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...