我正在寻找一种方法来创建一个新列,其值基于第一列中的值,在同一群集中得分最高。
目标是摆脱这个:
WORD | SCORE | Cluster |
diptyqu | 19750 | 1 |
daptyqu | 8830 | 1 |
dyptiqu | 29 | 1 |
deptiqu | 2 | 1 |
parfume | 300 | 2 |
parfum | 14 | 2 |
对此:
WORD | SCORE | Cluster | Name |
diptyqu | 19750 | 1 | diptyqu |
daptyqu | 8830 | 1 | diptyqu |
dyptiqu | 29 | 1 | diptyqu |
deptiqu | 2 | 1 | diptyqu |
parfume | 300 | 2 | parfume |
parfum | 14 | 2 | parfume |
我已经陷入困境,并不知道如何制作它。你有什么建议吗?
答案 0 :(得分:2)
使用dplyr
your_data %>%
group_by(cluster) %>%
mutate(Name = first(WORD))
它假设您的行已经按SCORE排序。如果需要,您也可以进行排序:
your_data %>%
group_by(cluster) %>%
arrange(desc(SCORE)) %>%
mutate(Name = first(WORD))
答案 1 :(得分:2)
与@ Gregor dplyr
解决方案类似的策略,但使用data.table
:
library(data.table)
setDT(d)
d[order(SCORE), Name := tail(WORD, 1), Cluster]
答案 2 :(得分:1)
do.call(rbind,
lapply(split(dat, dat$Cluster), function(a)
data.frame(a, Name = a$WORD[which.max(a$SCORE)])))
# WORD SCORE Cluster Name
#1.1 diptyqu 19750 1 diptyqu
#1.2 daptyqu 8830 1 diptyqu
#1.3 dyptiqu 29 1 diptyqu
#1.4 deptiqu 2 1 diptyqu
#2.5 parfume 300 2 parfume
#2.6 parfum 14 2 parfume
答案 3 :(得分:0)
您可以使用'data.table'包和合并功能:
library(data.table)
df2 <- setDT(df)[, .SD[which.max(SCORE)], Cluster]
result <- merge(df, df2[, c('Cluster', 'WORD')], by='Cluster')