根据其他列值创建列

时间:2017-11-16 19:48:32

标签: r

我正在寻找一种方法来创建一个新列,其值基于第一列中的值,在同一群集中得分最高。

目标是摆脱这个:

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 |

我已经陷入困境,并不知道如何制作它。你有什么建议吗?

4 个答案:

答案 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')
相关问题