2016-12-12 11 views
0

私は、独自の繁殖コードのPlantingsとDeath Countの合計を計算することができません。私はこれを行うために集計関数を使用しようとしています。集計関数を使用して一意の合計を計算する

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 

ローこの機能の後にサバイバルが計算されます。

現在のコードはここにこれをコードを入力され、問題のコードは(私は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

両方の方法で動作することが確認されましたが、data.tableの変数の一部が入力時に数値として変換された後にのみ有効です。何らかの理由で、ベクトルに数値を追加すると、それは文字に変わります。 – ImmortalMewtwo

答えて

0

あなたがしたいすべてが

test2 <- aggregate(cbind(rowPlanted, rowPsaDeath, rowSurvival) ~ BrCrCode, 
        data = test, FUN = sum) 
aggregate-であればそれはちょうど、このする必要があります
+0

ファイルからfirstDTデータをインポートする場合は、列クラスを事前に定義します。プログラム内で作成する場合は、列が数値であることを確認してください。今のところ、firstDT [、2:4] < - as.numeric(firstDT [、2:4])を使用して上のコード –

+0

を実行することができます。 'firstDT < - data.table(rowBrCrCode、rowPlanted、rowPsaDeath、rowSurvival)'です。ちょうど私がこの1つの方が気に入っていることを実感しました。クロスコードの種類をアルファベット順にソートします – 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 
関連する問題