根据剩下的列更改第一列

时间:2016-03-01 14:30:28

标签: r replace

我想更改S1列中的小组(S5 ... Var1),以将Freq列中的最大数字描述为{{1} },第二大S1等等。请注意,这种情况下的因素是S2列中的数字。因此,对于Position,我们将以Position == 26998698中的1587作为S1而不是outputS3作为{{{ 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)

要执行该操作的一些想法?

2 个答案:

答案 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