我想更改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_rankFreq(即不带间隙的最小等级),并使用它为Var1编制索引。由于我们想实际计算min_rank的对数而没有任何间隙,因此我们使用desc(Freq),即降序排列。

09-25 18:25
查看更多