我想更改S1
列中的小组(S5
... Var1
),以将Freq
列中的最大数字描述为{{1} },第二大S1
等等。请注意,这种情况下的因素是S2
列中的数字。因此,对于Position
,我们将以Position == 26998698
中的1587
作为S1
而不是output
,S3
作为{{{ 1}}在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)
要执行该操作的一些想法?
答案 0 :(得分:5)
这是使用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
的{{1}}(即无空位的最低排名),并使用该数据对Freq
进行索引。由于我们希望实际计算与Var1
无间隙的相反,我们使用min_rank
,即按降序排列。
答案 1 :(得分:4)
使用data.table
library(data.table)
setDT(df)[, Var1:= Var1[frank(-Freq, ties.method="dense")], by = Position]
# Var1 Freq Position
# 1: S5 1 26998698
# 2: S3 125 26998698
# 3: S1 1587 26998698
# 4: S2 340 26998698
# 5: S4 8 26998698
# 6: S4 68 27252684
# 7: S2 703 27252684
# 8: S1 913 27252684
# 9: S3 293 27252684
#10: S5 58 27252684
#11: S4 7 27209738
#12: S2 383 27209738
#13: S1 1425 27209738
#14: S3 239 27209738
#15: S5 6 27209738