2016-12-12 3 views
0

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

Goal: 

##  rowBrCrCode rowPlanted rowPsaDeath rowSurvival 
## 1:  GL_287   63   24   0 
## 2:  GL_287   13   7   0 
## 3:  GL_287   67   26   0 
## 4:  aCK_227   17   5   0 
## 5:  aCK_406   20   1   0 

into 

##  rowBrCrCode rowPlanted rowPsaDeath rowSurvival 
## 1:  GL_287  143   57   0 
## 2:  aCK_227   17   5   0 
## 3:  aCK_406   20   1   0 

rowSurvival будет рассчитан после этой функции.

Текущий код введите здесь этот код, проблематично код закомментирована (я пишу в R):

library(stringr) 
library(data.table) 
library(plyr) 
test <- fread(file.choose(), header = TRUE, data.table = TRUE) 
testRowLength <- nrow(test) 
rowBrCrCode <- "" 
rowPlanted <- 0 
rowPsaDeath <- 0 
rowSurvival <- 0 
for(i in 1:testRowLength){ 
    if(test$BrCrCode[i] == ""){ 
    test$BrCrCode[i] <- paste("PH_", i, sep = "") 
    print(paste("hit found, turned nothing into ", test$BrCrCode[i], sep = "")) 
    } 
    slashCount <- str_count(test$BrCrCode[i], '/') 
    if(slashCount == 1){ 
    print(paste("hit found, turn ", test$BrCrCode[i], " into ", unlist(strsplit(test$BrCrCode[i], split = '/', fixed=TRUE))[1], sep = "")) 
    test$BrCrCode[i] <- unlist(strsplit(test$BrCrCode[i], split = '/', fixed=TRUE))[1] 
    } 
    else if(slashCount > 1){ 
    print(paste("control found, value ", test$BrCrCode[i], " into ", paste("control_", unlist(strsplit(test$BrCrCode[i], split = '/', fixed=TRUE))[1], sep = ""), sep = "")) 
    test$BrCrCode[i] <- paste("control_", unlist(strsplit(test$BrCrCode[i], split = '/', fixed=TRUE))[1], sep = "") 
    } 
    rowBrCrCode[i] <- test$BrCrCode[i] 
    rowPlanted[i] <- test$Planted[i] 
    rowPsaDeath[i] <- test$PsaDeath[i] 
} 
firstDT <- data.table(rowBrCrCode, rowPlanted, rowPsaDeath, rowSurvival) 
print(firstDT) 
#firstDT_agg <- aggregate(x = firstDT, by = list(rowPlanted, rowPsaDeath), FUN = "sum") 
+0

Подтвердил, что оба способа работают, но только после того, как некоторые переменные в таблице данных были преобразованы при вводе как числовые. По какой-то причине, когда вы добавляете числа в вектор, он меняется на символ. – ImmortalMewtwo

ответ

0

Это должно быть только это, если все, что вам нужно сделать, это aggregate-

test2 <- aggregate(cbind(rowPlanted, rowPsaDeath, rowSurvival) ~ BrCrCode, 
        data = test, FUN = sum) 
+0

Если вы импортируете данные firstDT из файла, предварительно определите классы столбцов. Если вы создаете его в рамках программы, убедитесь, что столбцы являются числовыми. На данный момент вы можете использовать firstDT [, 2: 4] <- as.numeric (firstDT [, 2: 4]), а затем выполнить код выше –

+0

Он определялся в этой строке. 'firstDT <- data.table (rowBrCrCode, rowPlanted, rowPsaDeath, rowSurvival)'. Просто понял, что мне нравится этот лучше, он сортирует типы кросс-кода по алфавиту – ImmortalMewtwo

1

Набор данных, как представляется, data.table, поэтому мы можем использовать методы data.table. Сгруппировавшись по строке «rowBrCrCode», мы перебираем подмножество Data.table (.SD) и получаем sum.

library(data.table) 
dt[, lapply(.SD, sum), by = rowBrCrCode] 
#  rowBrCrCode rowPlanted rowPsaDeath rowSurvival 
#1:  GL_287  143   57   0 
#2:  aCK_227   17   5   0 
#3:  aCK_406   20   1   0 

 Смежные вопросы

  • Нет связанных вопросов^_^