2015-10-22 78 views
0

我對R相對較新,並且無法創建基於其他值求和某些值的向量。我不太確定問題是什麼。我沒有收到錯誤信息,但輸出結果不是我想要的。這裏是一個重複的例子:基於R中的其他值對列中的值進行求和

fakeprice <- c(1, 2, 2, 1, NA, 5, 4, 4, 3, 3, NA) 
fakeconversion <-c(.2, .15, .07, .25, NA, .4, .36, NA, .67, .42, .01) 
fakedata <- data.frame(fakeprice, fakeconversion) 
fake.list <- sort(unique(fakedata$fakeprice)) 
fake.sum <- vector(,5) 

所以,fakedata樣子:

fakeprice fakeconversion 
1   1   0.20 
2   2   0.15 
3   2   0.07 
4   1   0.25 
5   NA    NA 
6   5   0.40 
7   4   0.36 
8   4    NA 
9   3   0.67 
10   3   0.42 
11  NA   0.01 

我認爲問題出在NAS,但我不是很確定(也有不少在原始數據集)。這裏是嵌套if語句的for循環。我一直得到一個錯誤,當價格爲「NA」,所以我增加了is.na()

for(i in fake.list){ 
     sum=0 
     for(j in fakedata$fakeprice){ 
     if(is.na(fakedata$fakeprice[j])==TRUE){ 
      NULL 
     } else { 
      if(fakedata$fakeprice[j]==fake.list[i]){ 
      sum <- sum+fakedata$fakeconversion[j] 
      }} 
     } 
     fake.sum[i]=sum 
    } 
sumdata <- data.frame(fake.list, fake.sum) 

我正在尋找的是爲每一個獨特的價格加起來fakeconversion輸出。所以,對於fakeprice=1,fake.sum=0.45。由此產生的數據我找會是什麼樣子:

fake.list  fake.sum 
1   1   0.45 
2   2   0.22 
3   3   1.09 
4   4   0.36 
5   5   0.40 

我能得到什麼,卻是:

sumdata 
    fake.list fake.sum 
1   1  0.90 
2   2  0.44 
3   3  0.00 
4   4  0.00 
5   5  0.00 

任何幫助是非常感謝!

+1

如果R,你不會使用那樣的循環。你只需要使用'aggregate(fakeconversion〜fakeprice,fakedata,sum)'。這會給你你想要的結果。 – MrFlick

回答

0
aggregate(fakedata$fakeconversion, list(price = fakedata$fakeprice), sum, na.rm = TRUE) 

以上將在fakeprice4處理NA

aggregate函數通過將您的數據by進行子集化,然後運行函數FUN

所以:

aggregate(x, by, FUN, ...,) 

x是要運行在FUN什麼。如果您希望按多列分割數據,則可以給出By列表。

+0

哇...好容易多了。太棒了! –

+0

然後,我可以使用'aggregate(fakedata $ fakeconversion,list(price = fakedata $ fakeprice),mean,na.rm = TRUE)'來獲得每個價格的平均值。我如何在每個價格以及標準誤差中添加_n_? –

+0

@ J.Sweet'aggregate(fakedata $ fakeconversion,list(price = fakedata $ fakeprice),function(x)c(Sum = sum(x,na.rm = TRUE),n = sum(!is.na(x )),SE = sd(x,na.rm = TRUE)))'。你可以創建一個自定義函數來獲取這個對象,並在這個例子中計算你想要的矢量:'c(sum,n,std.error)'在這個例子中 – amwill04