2016-02-25 82 views
0

在下面的DATA表中,我列出了屬於三個組ABC的數字。我需要創建另一列NAYSA,其中包含相對於組中第一個數字的兩個數字的總和。並非所有組在我的數據集中都有多個數字。希望RESULT表格說明了我需要做的事情。R(dplyr):相對於列表中第一個值的值的總和列表

請注意,NAYSA列中每個組的第一行與DATA表中的YRS列的相同。但是,NAYSA列中的第3行是YRS列中來自第2行和第3行的值的總和。類似地,NAYSA中的行5和6是來自行4和行5的值的總和;和YRS列中的4和6。

我更喜歡使用dplyr的解決方案,但我願意接受其他建議。提前致謝。

DATA = data.frame(IND = c("A","B","B","C","C","C"), 
        YRS = c("1","10","20","100","1","10")) 

RESULT = data.frame(IND = c("A","B","B","C","C","C"), 
        YRS = c("1","10","20","100","1","10"), 
        NAYSA = c(1, 10, 30, 100, 101, 110)) 

回答

1

dplyr解決您預期的結果一致:

該解決方案的
library(dplyr) 
RESULT <- DATA %>% 
    # set the grouping factor 
    group_by(IND) %>% 
    # convert YRS to numeric and generate new variable by adding the 
    # first value on the YRS column to YRS on the current row, unless 
    # we are on the first row, in that case just keep the current value 
    # of YRS 
    mutate(YRS = as.numeric(as.character(YRS)), 
     NAYSA = ifelse(row_number() == 1, YRS, first(YRS) + YRS)) 

> RESULT 
Source: local data frame [6 x 3] 
Groups: IND [3] 

     IND YRS NAYSA 
    (fctr) (dbl) (dbl) 
1  A  1  1 
2  B 10 10 
3  B 20 30 
4  C 100 100 
5  C  1 101 
6  C 10 110 

一個需要注意的是,是不符合您的期望結果的數據類型,但我不知道在數據類型的例子就是你想要的。

我知道這個答案是非常類似於@Gopala提供的一個,但我想用first而不是索引使得代碼更清晰,另外,我用as.numeric,而不是as.integer因爲我覺得是一個比較普遍的做法。

我希望你覺得這個解決方案很有用。

+0

謝謝@Gopala和@donlelek!這段代碼正是我所需要的。每次我在這裏問一個問題時,我都會學習一種新方法......'ifelse'和'first'函數。對不起,因爲與'YRS'專欄混淆,我不小心將它輸入爲字符而不是數字。保重。 – Vesuccio

2

編輯以匹配所需的輸出,你可以使用mutate這樣的:

DATA$YRS <- as.integer(as.character(DATA$YRS)) 
DATA %>% group_by(IND) %>% mutate(NAYSA = ifelse(row_number() == 1, YRS, YRS + YRS[1])) 
Source: local data frame [6 x 3] 
Groups: IND [3] 

    IND YRS NAYSA 
    (fctr) (int) (int) 
1  A  1  1 
2  B 10 10 
3  B 20 30 
4  C 100 100 
5  C  1 101 
6  C 10 111 

順便說一句 - 我不得不轉換YRS如您在數據集中創建的列作爲特徵向量來第一個整數。當然,如果此列中的原始數據已經是數字格式,則不需要執行此步驟。

+0

這看起來不錯,但由於您已經在使用dplyr管道,爲什麼不在'mutate'步驟中將字符/因子轉換爲數字? –

+0

再次閱讀這個問題時,我想他們想要一個稍微不同的結果(檢查111和110)。 –

+0

您對預期產出是正確的。修改了代碼。我沒有在管道中使用因子轉換,因爲我不確定「真實」數據是否存在發佈的樣本數據中存在此問題。 – Gopala

相關問題