#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")