我想更改S1
列中的组(S5
... Var1
),以将Freq
列中最大的数字描述为S1
,将第二个最大的数字描述为S2
,依此类推。请注意,这种情况下的因素是Position
列中的数字。因此,例如对于Position == 26998698
,我们将在1587
中将S1
替换为output
,而不是S3
,在340
中将S2
替换为output
,以S4
结束,依此类推。
df <- 'Var1 Freq Position
S1 1 26998698
S2 125 26998698
S3 1587 26998698
S4 340 26998698
S5 8 26998698
S1 68 27252684
S2 703 27252684
S3 913 27252684
S4 293 27252684
S5 58 27252684
S1 7 27209738
S2 383 27209738
S3 1425 27209738
S4 239 27209738
S5 6 27209738'
df<- read.table(text=df, header=T)
我期望的
output
output <- 'Var1 Freq Position
S5 1 26998698
S3 125 26998698
S1 1587 26998698
S2 340 26998698
S4 8 26998698
S4 68 27252684
S2 703 27252684
S1 913 27252684
S3 293 27252684
S5 58 27252684
S4 7 27209738
S2 383 27209738
S1 1425 27209738
S3 239 27209738
S5 6 27209738'
output<- read.table(text=output, header=T)
有什么想法可以执行?
最佳答案
这是使用dplyr的方法:
library(dplyr)
df %>%
group_by(Position) %>%
mutate(Var1 = Var1[dense_rank(desc(Freq))])
#Source: local data frame [15 x 3]
#Groups: Position [3]
#
# Var1 Freq Position
# (fctr) (int) (int)
#1 S5 1 26998698
#2 S3 125 26998698
#3 S1 1587 26998698
#4 S2 340 26998698
#5 S4 8 26998698
#6 S4 68 27252684
#...
将数据按
Position
分组后,我们计算dense_rank
的Freq
(即不带间隙的最小等级),并使用它为Var1
编制索引。由于我们想实际计算min_rank
的对数而没有任何间隙,因此我们使用desc(Freq)
,即降序排列。