如何提取相同和最高的价值?

时间:2019-04-30 12:12:30

标签: r dataframe if-statement

我有一个如下表,如果行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列之间给了我相同的值,但是我想要类似的第二个命令和理想的Output。

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

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

2 个答案:

答案 0 :(得分:1)

使用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基座中执行相同的操作。想法是根据V4的值将数据分成几组,然后选择存在V4 == V8的任何情况的组,并从中拉出那一行,然后选择没有这种情况的组,然后您从此处拉出其中V8为最大值的行。

答案 1 :(得分:1)

我猜操作者想按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