Создайте вектор, который содержит значение темы для документа на основе наибольшего значения гаммы - PullRequest
0 голосов
/ 07 мая 2018

У меня есть один фрейм данных, который содержит 3 переменных (document, topic и gamma)

document    topic   gamma
1            1      0.932581726
1            2      0.015250915
1            3      0.009929329
2            1      0.032864538
2            2      0.012939786
2            3      0.13281681

Я хочу создать один вектор, содержащий значение темы для документа на основе наибольшего значения гаммы. Для какой темы значение гаммы является высоким, документ относится к этой теме.

Я попробовал какой-то код, но не уверен, что это правильный способ получить его.

a2<-function(x){
  i=1
while(i< 110)
  for(j in 1:7)
    x= max(ap_documents$gamma)
  return(j)
  }
a3<-sapply(ap_documents,a2)

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Если я понял, что вы хотите, вы можете использовать dplyr для этого.

library(dplyr)

result <- df %>% 
    group_by(topic) %>% 
    slice(topic_gamma = which.max(gamma))

result
## A tibble: 2 x 3
## Groups:   document [2]
#  document topic gamma
#     <dbl> <dbl> <dbl>
#1       1.    1. 0.933
#2       2.    3. 0.133
0 голосов
/ 07 мая 2018

Хотя другие решения работают нормально, я бы хотел упомянуть функцию top_n в dplyr, которая была создана для решения аналогичных задач:

library(dplyr)

my_df %>% 
  group_by(document) %>% 
  top_n(1, topic)

# A tibble: 2 x 3
# Groups:   document [2]
#   document topic   gamma
#      <int> <int>   <dbl>
# 1        1     3 0.00993
# 2        2     3 0.133

Другое простое решение Base R также:

my_df <- my_df[order(my_df$topic, decreasing = TRUE), ]
my_df[!duplicated(my_df$document), ]

#   document topic       gamma
# 3        1     3 0.009929329
# 6        2     3 0.132816810

Данные

my_df <- structure(list(document = c(1L, 1L, 1L, 2L, 2L, 2L), 
                        topic = c(1L, 2L, 3L, 1L, 2L, 3L), 
                        gamma = c(0.932581726, 0.015250915, 0.009929329, 
                                  0.032864538, 0.012939786, 0.13281681)), 
                   class = "data.frame", row.names = c(NA, -6L))
0 голосов
/ 07 мая 2018

Вот способ с dplyr:

library(dplyr)
df %>%
  group_by(document) %>%
  filter(gamma == max(gamma))
#output
# A tibble: 2 x 3
# Groups: document [2]
  document topic gamma
     <int> <int> <dbl>
1        1     1 0.933
2        2     3 0.133

в базе R, вы можете использовать aggregate:

aggregate(gamma ~ document, max, data = df)
#output
  document     gamma
1        1 0.9325817
2        2 0.1328168

, если вы хотите сохранить столбец темы, который выможно слить обратно:

merge(aggregate(gamma ~ document, max, data = df), df)
#output
  document     gamma topic
1        1 0.9325817     1
2        2 0.1328168     3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...