2017-11-16 28 views
0

最初の列の値に基づいて値を持つ新しい列を作成する方法を探しています。これに他の列に基づいて列を作成する値

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 | 

私はlitteralyこだわっていると、本当にそれを作る方法がわかりません。あなたはこれを行う方法について何か提案していますか? dplyr

your_data %>% 
    group_by(cluster) %>% 
    mutate(Name = first(WORD)) 

を使用して

答えて

3

それはあなたの行がすでにSCOREによってソートされている前提としています。 @のよ​​うにグレゴールのdplyrソリューションを

your_data %>% 
    group_by(cluster) %>% 
    arrange(desc(SCORE)) %>% 
    mutate(Name = first(WORD)) 
+0

ありがとうグレゴール、これは私が探していたものです! – Remi

2

同様の戦略を、しかしdata.tableを使用して::必要であれば、あなたもソートすることを行うことができます

library(data.table) 
setDT(d) 
d[order(SCORE), Name := tail(WORD, 1), Cluster] 
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 
0
あなたは 'data.table' パッケージを使用することができます

とマージ関数:

library(data.table) 
    df2 <- setDT(df)[, .SD[which.max(SCORE)], Cluster] 
    result <- merge(df, df2[, c('Cluster', 'WORD')], by='Cluster') 
関連する問題