Рассмотрим этот забавный пример
mytib <- tibble(text = c('i can see clearly now',
'the rain is gone'),
myweight = c(1.7, 0.005))
# A tibble: 2 x 2
text myweight
<chr> <dbl>
1 i can see clearly now 1.7
2 the rain is gone 0.005
Я знаю, как создать dfm
, взвешенный по docvars
myweight
. Я поступаю следующим образом:
dftest <- mytib %>%
corpus() %>%
tokens() %>%
dfm()
dftest * mytib$myweight
Document-feature matrix of: 2 documents, 9 features (50.0% sparse).
2 x 9 sparse Matrix of class "dfm"
features
docs i can see clearly now the rain is gone
text1 1.7 1.7 1.7 1.7 1.7 0 0 0 0
text2 0 0 0 0 0 0.005 0.005 0.005 0.005
Однако проблема в том, что я не могу использовать ни topfeatures
, ни colSums
.
Как тогда суммировать значения в каждом столбце?
> dftest*mytib$myweight %>% Matrix::colSums(.)
Error in base::colSums(x, na.rm = na.rm, dims = dims, ...) :
'x' must be an array of at least two dimensions
Спасибо!
сумасшедшие вещи. Зачем??
Иногда оператор %>%
скорее вредит, чем помогает. Это работает:
colSums(dftest * mytib$myweight)
## i can see clearly now the rain is gone
## 1.700 1.700 1.700 1.700 1.700 0.005 0.005 0.005 0.005
Также рассмотрите возможность использования dfm_weight(x, weights = ...)
, если у вас есть вектор весов для каждой функции. Операция, описанная выше, переработает ваши веса, чтобы заставить их работать так, как вы хотите, но вы должны понимать, почему (в R, из-за повторного использования и из-за его основного порядка столбцов).
Это было бы из-за приоритета оператора. Если мы проверим ?Syntax
, специальные операторы имеют более высокий приоритет по сравнению с умножением (*
)
...
%any% special operators (including %% and %/%) ###
* / multiply, divide ###
...
Оберните выражение внутри скобок, и оно должно работать
(dftest*mytib$myweight) %>%
colSums
# i can see clearly now the rain is gone
# 1.700 1.700 1.700 1.700 1.700 0.005 0.005 0.005 0.005
colSums(dftest * mytib$myweight)
работает для меня.