количество частот переменной во второй строке

#r #dplyr

#r #dplyr

Вопрос:

У меня есть фрейм данных, как показано ниже, и я ищу простое решение для подсчета переменных для имен столбцов, начинающихся с числа. после добавления второй строки в dataframe.

 df <- data.frame(AA=c(72,62,43,66,54,64,47,47,27,68),
                 BB=c("AMK","KAMl","HAJ","NHS","KUL","GAF","BGA","NHU","VGY","NHU"),
                 CC=c("TAMAN","GHUSI","KELVIN","DEREK","LOKU","MNDHUL","JASMIN","BINNY","BURTAM","DAVID"),
                 DD=c(62,41,37,41,32,74,52,75,59,36),
                 EE=c("CA","NY","GA","DE","MN","LA","GA","VA","TM","BA"),
                 FF=c("ENGLISH","FRENCH","ENGLISH","FRENCH","ENGLISH","ENGLISH","SPANISH","ENGLISH","SPANISH","RUSSIAN"),
                 GG=c(33,44,51,51,37,58,24,67,41,75),
                 `1A`=c("","D","","NA","","D","","","D",""),
                 `2B`=c("","A","","","A","A","A","A","",""),
                 `3C`=c("","","","","","","","","",""),
                 `4D`=c("","G","G","G","G","G","G","G","",""),
                  "Concatenate" = c("","DAG","G","NAG","AG","DAG","AG","AG","D",""))
  

вывод должен выглядеть так, как показано ниже. это будет похоже на количество значений для имен столбцов, которые начинаются с любого числа и суммы total в последнем столбце. после добавления второй строки во фрейм данных.

введите описание изображения здесь

Ответ №1:

Вы можете создать свою строку с

 summary_row = 
  df %>% 
  summarize(across(c(matches("^[0-9]"), Concatenate), ~sum(!is.na(.) amp; . != "" amp; . != "NA")))

summary_row
#   1A 2B 3C 4D Concatenate
# 1  3  5  0  7           8

result = bind_rows(mutate(summary_row, across(everything(), as.character)), df)
# reorder columns
result[names(df)]
#    AA   BB     CC DD   EE      FF GG 1A 2B 3C 4D Concatenate
# 1  NA <NA>   <NA> NA <NA>    <NA> NA  3  5  0  7           8
# 2  72  AMK  TAMAN 62   CA ENGLISH 33                        
# 3  62 KAMl  GHUSI 41   NY  FRENCH 44  D  A     G         DAG
# 4  43  HAJ KELVIN 37   GA ENGLISH 51           G           G
# 5  66  NHS  DEREK 41   DE  FRENCH 51 NA        G         NAG
# 6  54  KUL   LOKU 32   MN ENGLISH 37     A     G          AG
# 7  64  GAF MNDHUL 74   LA ENGLISH 58  D  A     G         DAG
# 8  47  BGA JASMIN 52   GA SPANISH 24     A     G          AG
# 9  47  NHU  BINNY 75   VA ENGLISH 67     A     G          AG
# 10 27  VGY BURTAM 59   TM SPANISH 41  D                    D
# 11 68  NHU  DAVID 36   BA RUSSIAN 75                        

  

Вы можете привязать его к верхней части вашего фрейма данных с bind_rows помощью, но только для целей представления. Столбцы фрейма данных могут иметь только один тип, поэтому числа в сводной строке будут преобразованы в символы, если они будут объединены с character уже имеющимися столбцами.


Я использовал эти данные (добавив check.names = FALSE в ваш data.frame() код, чтобы имена столбцов отображались как в вашем примере):

 df <- data.frame(AA=c(72,62,43,66,54,64,47,47,27,68),
                 BB=c("AMK","KAMl","HAJ","NHS","KUL","GAF","BGA","NHU","VGY","NHU"),
                 CC=c("TAMAN","GHUSI","KELVIN","DEREK","LOKU","MNDHUL","JASMIN","BINNY","BURTAM","DAVID"),
                 DD=c(62,41,37,41,32,74,52,75,59,36),
                 EE=c("CA","NY","GA","DE","MN","LA","GA","VA","TM","BA"),
                 FF=c("ENGLISH","FRENCH","ENGLISH","FRENCH","ENGLISH","ENGLISH","SPANISH","ENGLISH","SPANISH","RUSSIAN"),
                 GG=c(33,44,51,51,37,58,24,67,41,75),
                 `1A`=c("","D","","NA","","D","","","D",""),
                 `2B`=c("","A","","","A","A","A","A","",""),
                 `3C`=c("","","","","","","","","",""),
                 `4D`=c("","G","G","G","G","G","G","G","",""),
                  "Concatenate" = c("","DAG","G","NAG","AG","DAG","AG","AG","D",""), check.names = F)
  

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

1. но это не охватывает сумму столбцов требуемых переменных

2. а также столбец concat должен быть последним

3. На выходе я получаю это.. Объединить AA BB CC DD EE FF GG X1A X2B X3C X4D 8 NA NA NA NA NA NA NA NA NA NA NA NA

4. результат должен быть таким: AA BB CC DD EE FF GG X1A X2B X3C X4D Объединить 3 5 7 8

5. Хорошо, я взял вашу фотографию буквально и «имена столбцов, которые начинаются с любого числа» буквально, похоже, что ваши имена на самом деле X1A, X2B, ... . Если вы хотите сопоставить имена столбцов, начинающиеся с X и номер, измените matches("^[0-9]") на matches("^X[0-9]")

Ответ №2:

Мы можем использовать base R с colSums

 nm1 <- grep('^[0-9]', names(df), value = TRUE)
colSums(!is.na(df[nm1]) amp; df[nm1] != "" amp; df[nm1] != "NA")