Совокупные / сумма и N / A значения - PullRequest
0 голосов
/ 14 января 2019

У меня проблема с тем, как агрегат или N / A обрабатывает суммы.

Я хотел бы получить суммы на код зоны из следующей таблицы

test <- read.table(text = "
area.code   A    B   C   D
1          0  NA 0.00  NA  NA
2          1 0.0 3.10 9.6 0.0
3          1 0.0 3.20 6.0 0.0
4          2 0.0 6.10 5.0 0.0
5          2 0.0 6.50 8.0 0.0
6          2 0.0 6.90 4.0 3.1
7          3 0.0 6.70 3.0 3.2
8          3 0.0 6.80 3.1 6.1
9          3 0.0 0.35 3.2 6.5
10         3 0.0 0.67 6.1 6.9
11         4 0.0 0.25 6.5 6.7
12         5 0.0 0.68 6.9 6.8
13         6 0.0 0.95 6.7 0.0
14         7 1.2   NA 6.8 0.0
")

Итак, кажется довольно просто:

aggregate(.~area.code, test, sum)



area.code A     B    C    D
1         1 0  6.30 15.6  0.0
2         2 0 19.50 17.0  3.1
3         3 0 14.52 15.4 22.7
4         4 0  0.25  6.5  6.7
5         5 0  0.68  6.9  6.8
6         6 0  0.95  6.7  0.0

Видимо, не все так просто, потому что код области 7 полностью исключен из команды aggregate ().

Однако я хотел бы, чтобы N / As полностью игнорировались или вычислялись как нулевые значения. Какая команда na = дает эту опцию?

замена всех N / As на 0 - вариант, если я просто хочу получить сумму ... но тогда среднее значение действительно проблематично (поскольку оно больше не может различать 0 и N / A)

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Если вы готовы рассмотреть внешний пакет (data.table):

setDT(test)
test[, lapply(.SD, sum), area.code]
   area.code   A     B    C    D
1:         0  NA  0.00   NA   NA
2:         1 0.0  6.30 15.6  0.0
3:         2 0.0 19.50 17.0  3.1
4:         3 0.0 14.52 15.4 22.7
5:         4 0.0  0.25  6.5  6.7
6:         5 0.0  0.68  6.9  6.8
7:         6 0.0  0.95  6.7  0.0
8:         7 1.2    NA  6.8  0.0
0 голосов
/ 14 января 2019

Другое решение заключается в использовании dplyr:

test %>%
  group_by(area.code) %>%
  summarise_all(sum, na.rm = TRUE)
0 голосов
/ 14 января 2019

Один из вариантов - создать функцию, которая выдает NA, когда все значения равны NA, или иным образом использует sum. Наряду с этим, используйте аргумент na.action в aggregate, так как aggregate может удалить строку, если есть хотя бы один NA

f1 <- function(x) if(all(is.na(x))) NA else sum(x, na.rm = TRUE)
aggregate(.~area.code, test, f1, na.action = na.pass)
# area.code   A     B    C    D
#1         0  NA  0.00   NA   NA
#2         1 0.0  6.30 15.6  0.0
#3         2 0.0 19.50 17.0  3.1
#4         3 0.0 14.52 15.4 22.7
#         4 0.0  0.25  6.5  6.7
#6         5 0.0  0.68  6.9  6.8
#7         6 0.0  0.95  6.7  0.0
#8         7 1.2    NA  6.8  0.0

Когда есть только NA элементов и мы используем sum с na.rm = TRUE, возвращается 0

sum(c(NA, NA), na.rm = TRUE)
#[1] 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...