Попытка найти суммы строк в R с помощью dplyr, а затем отфильтровать столбцы

Поэтому я думал, что это будет немного проще, но оказалось, что это не так.

Я хотел бы получить общее количество строк для каждой строки и отфильтровать строки, в которых общее количество строк не равно 0, но, поскольку первый столбец является идентификатором, мне нужно только суммировать все, кроме первого (используя dplyr). Кроме того, любой столбец = 0 также должен быть отфильтрован.

df %>%
  mutate(Total = rowSums(.[2:.N])) %>%
  filter(Total != 0)

Но я получаю следующую ошибку:

Error in 2:.N : argument of length 0

Вот ДФ:

df <- structure(list(Sequence = c(12, 600, 620, 630, 660, 770, 780, 
800, 6900), Period_1 = c(1, 0, 0, 0, 0, 0, 0, 0, 3), Period_2 = c(2, 
0, 0, 0, 0, 0, 0, 0, 4), Period_3 = c(23232, 0, 0, 0, 0, 0, 0, 
0, -103), Period_4 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_5 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_6 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_7 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_8 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_9 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_10 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_11 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_12 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_13 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_14 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_15 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_16 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_17 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_18 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_19 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_20 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_21 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_22 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_23 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_24 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_25 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_26 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_27 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_28 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_29 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_30 = c(NA, -1170303.36, -449711.72, 
0, 0, -30548246.94, -42287004.62, 2.98818, NA), Period_31 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_32 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_33 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_34 = c(NA, 
0, 0, 497378.9, 191127.5, 0, 0, 0, NA), Period_35 = c(NA, 0, 
0, 0, 0, 0, 0, 0, NA), Period_36 = c(NA, 0, 0, 0, 0, 0, 0, 0, 
NA), Period_37 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_38 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_39 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_40 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_41 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_42 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_43 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_44 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_45 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_46 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_47 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_48 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_49 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_50 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_51 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_52 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_53 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_54 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_55 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_56 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_57 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_58 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_59 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_60 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_61 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_62 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_63 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_64 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_65 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_66 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_67 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_68 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_69 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_70 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_71 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_72 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_73 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_74 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_75 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_76 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_77 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_78 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_79 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_80 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_81 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_82 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_83 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_84 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_85 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_86 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_87 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_88 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_89 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_90 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_91 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_92 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_93 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_94 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_95 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_96 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_97 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_98 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_99 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_100 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_101 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_102 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_103 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_104 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_105 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_106 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_107 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_108 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_109 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_110 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_111 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_112 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_113 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_114 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_115 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA), Period_116 = c(NA, 
0, 0, 0, 0, 0, 0, 0, NA), Period_117 = c(NA, 0, 0, 0, 0, 0, 0, 
0, NA), Period_118 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA)), row.names = c(NA, 
-9L), class = c("tbl_df", "tbl", "data.frame"))

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


person Johnny Thomas    schedule 01.08.2019    source источник
comment
Вы имели в виду df %>% mutate(Total = rowSums(.[2:ncol(df)])) %>% filter(Total != 0). .N используется в контексте data.table, возвращает количество строк   -  person akrun    schedule 01.08.2019
comment
``` Ошибка: положительные индексы столбцов в [ должны совпадать с количеством столбцов: * .data имеет 119 столбцов ```   -  person Johnny Thomas    schedule 01.08.2019
comment
Я впервые вижу >%> вместо символа трубы.   -  person Rui Barradas    schedule 01.08.2019
comment
@RuiBarradas, лол, ой   -  person Johnny Thomas    schedule 01.08.2019
comment
С вашим dput я не получаю никаких ошибок. Если вы сгруппировали его df %>% ungroup. %>% mutate(Total = rowSums(.[2:ncol(df)])) %>% filter(Total != 0)   -  person akrun    schedule 01.08.2019
comment
Данные @akrun не сгруппированы, а вывод идентичен   -  person Johnny Thomas    schedule 01.08.2019
comment
Ошибка: положительные индексы столбцов в [ должны соответствовать количеству столбцов: * .data имеет 119 столбцов * позиция 119 равна 120 * позиция 120 равна 121 * позиция 121 равна 122 * позиция 122 равна 123   -  person Johnny Thomas    schedule 01.08.2019
comment
Я использовал dplyr_0.8.3   -  person akrun    schedule 01.08.2019
comment
С предоставленными данными Total всегда не равно нулю.   -  person Rui Barradas    schedule 01.08.2019
comment
это правильно, однако я строю для будущих случаев.   -  person Johnny Thomas    schedule 01.08.2019


Ответы (1)


library(janitor)

# Drop rows where the row total is 0
# adorn_totals() skips the first column, assuming it's an identifier
out <- df %>%
  adorn_totals(c("row", "col")) %>%
  filter(Total != 0)

# Then drop columns where the column total is zero
out[, unlist(out[nrow(out),]) != 0]

Я сократил ваши входные данные до:

df <- data.frame(Sequence = c(12, 600, 620, 630, 660, 770, 780, 
                                  800, 6900), Period_1 = c(1, 0, 0, 0, 0, 0, 0, 0, 3), Period_2 = c(2, 
                                                                                                    0, 0, 0, 0, 0, 0, 0, 4), Period_3 = c(23232, 0, 0, 0, 0, 0, 0, 
                                                                                                                                          0, -103), Period_4 = c(NA, 0, 0, 0, 0, 0, 0, 0, NA))
person Sam Firke    schedule 01.08.2019