ОШИБКА при использовании count в R, который работал раньше

#r #count #compiler-errors

#r #подсчет #ошибки компилятора

Вопрос:

я использовал count для подсчета одних и тех же строк и получения частоты, и он работал очень хорошо, как 2 часа назад, и теперь он выдает мне ОШИБКУ, которую я не понимаю. Я хотел, чтобы каждый раз, когда у меня есть одна и та же строка, добавляйте концентрацию этих строк. Вот мои игрушечные данные и моя функция.

 df=data.frame(ID=seq(1:6),A=rep(0,6),B=c(rep(0,5),1),C=c(rep(1,5),0),D=rep(1,6),E=c(rep(0,3),rep(1,2),0),concentration=c(0.002,0.004,0.001,0.0075,0.00398,0.006))
 df
  ID A B C D E concentration
1  1 0 0 1 1 0       0.00200
2  2 0 0 1 1 0       0.00400
3  3 0 0 1 1 0       0.00100
4  4 0 0 1 1 1       0.00750
5  5 0 0 1 1 1       0.00398
6  6 0 1 0 1 0       0.00600

freq.concentration=function(df,Vars){
  df=data.frame(df)
  Vars=as.character(Vars)
  compte=count(df,Vars)
  frequence.C= (compte$freq)/nrow(df)
  output=cbind(compte,frequence.C)
  return(output)
}

freq.concentration(df,colnames(df[2:6]))

# and here is the error that i get when i run the function which was working perfectly a while ago!
#  Error: Must group by variables found in `.data`.
# * Column `Vars` is not found.
# Run `rlang::last_error()` to see where the error occurred. 
  

PS: Я не знаю, связано ли это или нет, но у меня возникла эта проблема, когда я открыл Rmd скрипта и скопировал всю свою функцию в этот скрипт, и внезапно моя функция перестала работать.
Я действительно ценю вашу помощь заранее. Спасибо.

Вот результат, который я получил, когда он работал должным образом :

 
 output
  ID A B C D E  concentration.C.1 concentration.C.2
1  1 0 0 1 1 0          3                0.007
2  4 0 0 1 1 1          2                0.01148
3  6 0 1 0 1 0          1                0.00600



  

Первые 3 строки похожи, поэтому мы суммируем концентрацию 3 и получаем 0,007, а затем строки 4 и 5 совпадают, поэтому мы добавляем их концентрацию и получаем 0,01148, а последняя строка уникальна, поэтому концентрация остается прежней.

Ответ №1:

Мы можем преобразовать в sym bol и вычислить ( !!! ), count чтобы получить количество частот на основе этих столбцов, а затем получить ‘frequence.C’ как доля ‘n’ с sum этим количеством

 library(dplyr)
freq.concentration <- function(df, Vars){
     df  %>%     
      count(!!! rlang::syms(Vars))  %>%
      mutate(frequence.C = n/sum(n))
      
    }
  

-тестирование

 freq.concentration(df,colnames(df)[2:6])
#  A B C D E n frequence.C
#1 0 0 1 1 0 3   0.5000000
#2 0 0 1 1 1 2   0.3333333
#3 0 1 0 1 0 1   0.1666667
  

Если нам нужна sum «концентрация», мы могли бы использовать group_by операцию вместо count

 freq.concentration <- function(df, Vars){
     df  %>% 
        group_by(across(all_of(Vars))) %>%
        summarise(n = n(), frequency.C = sum(concentration), .groups = 'drop')
   }
  

-тестирование

 freq.concentration(df,colnames(df)[2:6])
# A tibble: 3 x 7
#      A     B     C     D     E     n frequency.C
#  <dbl> <dbl> <dbl> <dbl> <dbl> <int>       <dbl>
#1     0     0     1     1     0     3      0.007 
#2     0     0     1     1     1     2      0.0115
#3     0     1     0     1     0     1      0.006 
  

Комментарии:

1. Это действительно не дает никакой ошибки, но все еще не дает мне желаемого результата, я добавлю результат, который у меня был в сообщении.

2. @Janet Я добавил frequency.C. Ранее я просто хотел показать, где была ошибка

3. посмотрите, я отредактировал сообщение, чтобы вы могли видеть ожидаемый результат. Заранее благодарю вас.

4. @Janet Я изменил расчет на основе вашего нового ожидаемого вывода, предполагая, что это значение sum концентрации

5. Спасибо @akrun на самом деле вы дали мне еще один ответ на другую проблему, с которой я столкнулся. Я прошу прощения, если сначала не понял. Я действительно ценю вашу помощь. я собираюсь использовать оба ваших ответа! Еще раз спасибо