Суммирование каждого столбца по выбранным нескольким конкретным строкам - в R - PullRequest
2 голосов
/ 28 мая 2019

Я недавно начал изучать RДля одного из моих кодов я довольно долго пытался отладить эту проблему.

У меня есть данные, которые выглядят так:

dd
    [,1]       [,2]   [,3] 
[1,] "Category" "A"    "B"  
[2,] "ONE"      "23"   "45" 
[3,] "TWO"      "234"  "23" 
[4,] "THREE"    "565"  "324"
[5,] "FOUR"     "676"  "343"
[6,] "FIVE"     "1231" "544"   

Я хочу добавить строки: ONE, THREE и FIVE (в категории) для каждого из столбцов.Поэтому вывод будет выглядеть так:

sum  1819   913

Я попытался использовать rowSums и sum.Я получаю ошибку каждый раз, когда использую это.Одна из наиболее распространенных ошибок показана ниже.

sum = rowSums(subset(dd, CATEGORY == 'ONE', 'THREE', 'FIVE'))
Error in rowSums(subset(spread_DNT_TXN, CATEGORY == "Invoiced")) : 
  'x' must be numeric

Я ищу, как я могу выполнить эту функцию.Я не могу найти это нигде.

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 28 мая 2019

В базе R вы можете сделать:

# Load your data first
dd <- read.table(header = TRUE, text = '
"Category" "A"    "B"  
"ONE"      "23"   "45" 
"TWO"      "234"  "23" 
"THREE"    "565"  "324"
"FOUR"     "676"  "343"
"FIVE"     "1231" "544"')

# Summarize by selected catagories
colSums(subset(dd, Category %in% c("ONE", "THREE", "FIVE"), select = -Category))
#   A    B 
#1819  913

Или, альтернативно, используя aggregate:

aggregate(cbind(A, B) ~ 1, 
          data = subset(dd, Category %in% c("ONE", "THREE", "FIVE")),
          FUN = sum)
#     A   B
#1 1819 913

и, возможно, более идиоматический R:

dd$ofInterest <- dd$Category %in% c("ONE", "THREE", "FIVE")
aggregate(cbind(A, B) ~ ofInterest, data = dd, FUN = sum)
#  ofInterest    A   B
#1      FALSE  910 366
#2       TRUE 1819 913
0 голосов
/ 28 мая 2019

Мы можем сделать это за base R.Обратите внимание, что набор данных OP равен matrix, а матрица может содержать только один класс.Если есть один символьный элемент, вся матрица будет преобразована в character класс.Здесь по какой-то причине заголовки находятся в первой строке, а также в том, что первый столбец равен character.Одним из вариантов будет подмножество числовых столбцов, преобразование типа и затем выбор интересующих строк для rowSums

m1 <- matrix(as.numeric(dd[-1, 2:3]), ncol = 2)
i1 <- dd[-1, 1] %in% c("ONE", "THREE", "FIVE")
rowSums(m1[i1, ])
#[1]   68  889 1775

Или, если это должна быть сумма по столбцам

colSums(m1[i1, ])
#[1] 1819  913

данные

dd <- cbind(c("Category", "ONE", "TWO", "THREE", "FOUR", "FIVE"),
    c("A", 23, 234, 565, 676, 1231), c("B", 45, 23, 324, 343, 544))
0 голосов
/ 28 мая 2019

Для начала вы можете использовать оператор %in% и colSums:

colSums( dd[dd$Category %in% c("ONE", "THREE", "FIVE"), c("A", "B") )

Однако я рекомендую использовать data.table вместо data.frame или dplyr.Я нахожу нарезку и группировку очень понятными с этим пакетом.

Сначала установите и загрузите data.table:

install.packages("data.table")
library(data.table)

Затем превратите ваш старый data.frame в data.table:

dd <- as.data.table(dd)

Теперь сумма:

dd[Category %in% c("ONE", "THREE", "FIVE"), list(Sum_of_A = sum(A), Sum_of_B = sum(B))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...