R 如何提取相同且最高的值?
我有一个如下所示的表,如果第4行和第8行中的行具有相同的值,我喜欢提取行,否则为最大值R 如何提取相同且最高的值?,r,dataframe,if-statement,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
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)),]
使用dplyr:
结果:
# 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
您可能也可以使用split在base R中执行相同的操作。其思想是根据V4的值将数据分成若干组,然后选择V4==V8的任意情况下的组并从中提取该行,以及不存在该情况下的组,然后从中提取V8为最大值的行。我猜op希望按V3进行分组,因此,该方法应先按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
我不明白你的问题?为什么第二行是您想要的输出?第四列和第八列不相等,它们也不是最大值。为什么结果只是原始data.frame的子集?我也不完全理解输出背后的逻辑,正如cettt已经说明的那样。@Cett,第二行,由于第4列和第8列中的值不相同,我希望第5列到第7列的最大值与第1列到第8列重叠3@DSGym,我的原始文件真的很大,所以我选择了其中的一个子集。最大值是什么意思?在哪一列?因此,对于第4列中的每个数字,您希望保留第8列与之相等的行,或者,如果第8行中的数字不相等,则保留第8列值最高的行?您认为V3是如何工作的?我的意思是,你的结果似乎是准确的,但我不确定为什么…@iod,我比较了数据输入和期望的输出,猜测这就是op想要的。或者可能是group_byV2、V3或group_byV2,因为V2和V3似乎都是标识符或1对1。我不得不猜测,因为op没有提供变量的含义。在我看来,有很多ID,但为什么不按V4分组呢?另外,如果maxV8大于V4,会发生什么情况?然后您将得到V4==V8和maxV8行。
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